format a string containing a printf format specifier with JNI
/**
@version 1.10 1997-07-01
@author Cay Horstmann
*/
#include "Printf2.h"
#include <string.h>
#include <stdlib.h>
#include <float.h>
/**
@param format a string containing a printf format specifier
(such as "%8.2f"). Substrings "%%" are skipped.
@return a pointer to the format specifier (skipping the '%')
or NULL if there wasn't a unique format specifier
*/
char* find_format(const char format[])
{
char* p;
char* q;
p = strchr(format, '%');
while (p != NULL && *(p + 1) == '%') /* skip %% */
p = strchr(p + 2, '%');
if (p == NULL) return NULL;
/* now check that % is unique */
p++;
q = strchr(p, '%');
while (q != NULL && *(q + 1) == '%') /* skip %% */
q = strchr(q + 2, '%');
if (q != NULL) return NULL; /* % not unique */
q = p + strspn(p, " -0+#"); /* skip past flags */
q += strspn(q, "0123456789"); /* skip past field width */
if (*q == '.') { q++; q += strspn(q, "0123456789"); }
/* skip past precision */
if (strchr("eEfFgG", *q) == NULL) return NULL;
/* not a floating-point format */
return p;
}
JNIEXPORT jstring JNICALL Java_Printf2_sprint(JNIEnv* env, jclass cl,
jstring format, jdouble x)
{
const char* cformat;
char* fmt;
jstring ret;
cformat = (*env)->GetStringUTFChars(env, format, NULL);
fmt = find_format(cformat);
if (fmt == NULL)
ret = format;
else
{
char* cret;
int width = atoi(fmt);
if (width == 0) width = DBL_DIG + 10;
cret = (char*) malloc(strlen(cformat) + width);
sprintf(cret, cformat, x);
ret = (*env)->NewStringUTF(env, cret);
free(cret);
}
(*env)->ReleaseStringUTFChars(env, format, cformat);
return ret;
}
//////////////
/*
This program is a part of the companion code for Core Java 8th ed.
(http://horstmann.com/corejava)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @version 1.10 1997-07-01
* @author Cay Horstmann
*/
class Printf2
{
public static native String sprint(String format, double x);
static
{
System.loadLibrary("Printf2");
}
}
/*
This program is a part of the companion code for Core Java 8th ed.
(http://horstmann.com/corejava)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @version 1.10 1997-07-01
* @author Cay Horstmann
*/
class Printf2Test
{
public static void main(String[] args)
{
double price = 44.95;
double tax = 7.75;
double amountDue = price * (1 + tax / 100);
String s = Printf2.sprint("Amount due = %8.2f", amountDue);
System.out.println(s);
}
}
Printf2Test.zip( 2 k)Related examples in the same category