Java 十进制模式问题
我尝试在Android中使用NumberFormatter格式化一个数字。我使用下面的代码,它工作得非常完美:Java 十进制模式问题,java,android,Java,Android,我尝试在Android中使用NumberFormatter格式化一个数字。我使用下面的代码,它工作得非常完美: NumberFormat formatter = new DecimalFormat("###,###"); String myFormattedString = formatter.format(123456); 但是,当我使用带空格的模式时,比如:new DecimalFormat(“####,###”)它抛出一个非法argumentException。我阅读了有关Numbe
NumberFormat formatter = new DecimalFormat("###,###");
String myFormattedString = formatter.format(123456);
但是,当我使用带空格的模式时,比如:new DecimalFormat(“####,###”)
它抛出一个非法argumentException
。我阅读了有关NumberFormatter和DecimalFormatter的文档,但没有发现任何关于模式中空格的内容。有人能解释我为什么不能使用空格,或者如何将它们添加为允许的字符吗。
提前感谢 < P>你不能在一个数字的中间放空格:它不是有效的格式。< /P> 如果你看一下,你会看到: 前缀: 除\uFFFE、\uFFFF和特殊字符以外的任何Unicode字符 后缀: 除\uFFFE、\uFFFF和特殊字符以外的任何Unicode字符 编号: 整数指数选择 整数分数指数
不复制整个文档,“代码>编号模式中的任何组件都不接受空格,所以尝试在中间安装一个空间是行不通的。你只能在前缀或后缀中使用空格。
你不能在一个数字的中间放空格:它不是有效的格式。< /P> 如果你看一下,你会看到: 前缀: 除\uFFFE、\uFFFF和特殊字符以外的任何Unicode字符 后缀: 除\uFFFE、\uFFFF和特殊字符以外的任何Unicode字符 编号: 整数指数选择 整数分数指数不复制整个文档,“代码>编号模式中的任何组件都不接受空格,所以尝试在中间安装一个空间是行不通的。只能在前缀或后缀中使用空格。
在常规JDK中,这不会引发异常-它只是将数字格式化为123456
不清楚您的示例中的空格是什么。对于符号的角色,您有两个选项:
- 小数分隔符
- 组分隔符
- 指数分离器
- 货币小数分隔符
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
formatter.setSymbols(symbols);
在常规JDK中,这不会引发异常-它只是将数字格式化为
123456
不清楚您的示例中的空格是什么。对于符号的角色,您有两个选项:
- 小数分隔符
- 组分隔符
- 指数分离器
- 货币小数分隔符
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
formatter.setSymbols(symbols);
通过使用standart formatter创建自己的格式化程序,并使用例外查找禁止的符号,我实现了我的目标。希望对其他人有用
public static String getFormattedNumberWithPattern(String aPattern,
float aNumber) {
String lFormattedNumber = null;
String lOriginalPattern = aPattern;
try {
Hashtable<Integer, String> lIlligalChars = new Hashtable<Integer, String>();
// analyze illegal characters
for (int i = aPattern.length() - 1; i >= 0; i--) {
char[] lAux = new char[1];
aPattern.getChars(i, i + 1, lAux, 0);
try {
// if character is illegal, it throws an exception
@SuppressWarnings("unused")
NumberFormat lNumberFormatter = new DecimalFormat("#"
+ lAux[0] + "#");
} catch (IllegalArgumentException e) {
// add illegal chars and indexes to dictionary
lIlligalChars.put(new Integer(i), String.valueOf(lAux[0]));}}
Enumeration<String> lChars = lIlligalChars.elements();
while (lChars.hasMoreElements()) {
String lIllegalChar = lChars.nextElement();
// remove illegal chars from pattern
aPattern = removeChar(aPattern, lIllegalChar.charAt(0));
}
// format number using legal pattern
NumberFormat lNumberFormatter = new DecimalFormat(aPattern);
lFormattedNumber = lNumberFormatter.format(aNumber);
int lLenghtDifference = lOriginalPattern.length()
- lFormattedNumber.length();
// add illegal chars to formatted string using their indexes
Enumeration<Integer> lKeys = lIlligalChars.keys();
while (lKeys.hasMoreElements()) {
Integer lIllegalCharIndex = lKeys.nextElement();
int lInsertIndex = lIllegalCharIndex.intValue()
- lLenghtDifference;
// insert illegal chars into formatted number
if (lInsertIndex >= 0
|| lInsertIndex < lFormattedNumber.length()) {
lFormattedNumber = new StringBuffer(lFormattedNumber)
.insert(lInsertIndex,
lIlligalChars.get(lIllegalCharIndex)
.charAt(0)).toString();
}
}
} catch (Exception e) {
// Log.d("info", "formater error:" + e + "mask: " + aPattern
// + " number:" + aNumber);
}
return lFormattedNumber;
}
public static String removeChar(String s, char c) {
StringBuffer r = new StringBuffer(s.length());
r.setLength(s.length());
int current = 0;
for (int i = 0; i < s.length(); i++) {
char cur = s.charAt(i);
if (cur != c)
r.setCharAt(current++, cur);
}
r.setLength(current);
return r.toString();
}
公共静态字符串getFormattedNumberWithPattern,
浮点数(个){
字符串lFormattedNumber=null;
字符串lOriginalPattern=aPattern;
试一试{
Hashtable lIlligalChars=新的Hashtable();
//分析非法字符
对于(int i=apatern.length()-1;i>=0;i--){
char[]lAux=新字符[1];
阿帕特尔·盖查斯(i,i+1,劳克斯,0);
试一试{
//如果字符是非法的,它将抛出一个异常
@抑制警告(“未使用”)
NumberFormat lNumberFormatter=新的十进制格式(“#”
+lAux[0]+“#”)号;
}捕获(IllegalArgumentException e){
//向字典中添加非法字符和索引
lIlligalChars.put(新整数(i),String.valueOf(lAux[0]);}
枚举lChars=lIlligalChars.elements();
while(lChars.hasMoreElements()){
字符串lIllegalChar=lChars.nextElement();
//从模式中删除非法字符
aPattern=removeChar(aPattern,lIllegalChar.charAt(0));
}
//使用合法模式设置数字格式
NumberFormat lNumberFormatter=新的十进制格式(APTern);
lFormattedNumber=lNumberFormatter.format(一个编号);
int-lLenghtDifference=lOriginalPattern.length()
-lFormattedNumber.length();
//使用非法字符的索引向格式化字符串添加非法字符
枚举lKeys=lIlligalChars.keys();
while(lKeys.hasMoreElements()){
整数lIllegalCharIndex=lKeys.nextElement();
int lInsertIndex=lIllegalCharIndex.intValue()
-朗赫特差异;
//在格式化的数字中插入非法字符
如果(lInsertIndex>=0
||lInsertIndex
通过使用standart formatter创建自己的格式化程序,并使用例外查找禁止的符号,我实现了我的目标。希望对其他人有用
public static String getFormattedNumberWithPattern(String aPattern,
float aNumber) {
String lFormattedNumber = null;
String lOriginalPattern = aPattern;
try {
Hashtable<Integer, String> lIlligalChars = new Hashtable<Integer, String>();
// analyze illegal characters
for (int i = aPattern.length() - 1; i >= 0; i--) {
char[] lAux = new char[1];
aPattern.getChars(i, i + 1, lAux, 0);
try {
// if character is illegal, it throws an exception
@SuppressWarnings("unused")
NumberFormat lNumberFormatter = new DecimalFormat("#"
+ lAux[0] + "#");
} catch (IllegalArgumentException e) {
// add illegal chars and indexes to dictionary
lIlligalChars.put(new Integer(i), String.valueOf(lAux[0]));}}
Enumeration<String> lChars = lIlligalChars.elements();
while (lChars.hasMoreElements()) {
String lIllegalChar = lChars.nextElement();
// remove illegal chars from pattern
aPattern = removeChar(aPattern, lIllegalChar.charAt(0));
}
// format number using legal pattern
NumberFormat lNumberFormatter = new DecimalFormat(aPattern);
lFormattedNumber = lNumberFormatter.format(aNumber);
int lLenghtDifference = lOriginalPattern.length()
- lFormattedNumber.length();
// add illegal chars to formatted string using their indexes
Enumeration<Integer> lKeys = lIlligalChars.keys();
while (lKeys.hasMoreElements()) {
Integer lIllegalCharIndex = lKeys.nextElement();
int lInsertIndex = lIllegalCharIndex.intValue()
- lLenghtDifference;
// insert illegal chars into formatted number
if (lInsertIndex >= 0
|| lInsertIndex < lFormattedNumber.length()) {
lFormattedNumber = new StringBuffer(lFormattedNumber)
.insert(lInsertIndex,
lIlligalChars.get(lIllegalCharIndex)
.charAt(0)).toString();
}
}
} catch (Exception e) {
// Log.d("info", "formater error:" + e + "mask: " + aPattern
// + " number:" + aNumber);
}
return lFormattedNumber;
}
public static String removeChar(String s, char c) {
StringBuffer r = new StringBuffer(s.length());
r.setLength(s.length());
int current = 0;
for (int i = 0; i < s.length(); i++) {
char cur = s.charAt(i);
if (cur != c)
r.setCharAt(current++, cur);
}
r.setLength(current);
return r.toString();
}
公共静态字符串getFormattedNumberWithPattern,
浮点数(个){
字符串lFormattedNumber=null;
字符串lOriginalPattern=aPattern;
试一试{
Hashtable lIlligalChars=新Hashta