zig*_*ggy 4 java string formatting datetime text
使用Number格式的Currency实例进行语法分析时,为什么以下生成解析异常.
float f1 = 123.45678f;
Locale locFR = new Locale("fr");
NumberFormat[] nfa = new NumberFormat[4];
nfa[0] = NumberFormat.getInstance(); //default
nfa[1] = NumberFormat.getInstance(locFR); //FranceLocale
nfa[2] = NumberFormat.getCurrencyInstance(); //Default Currency
nfa[3] = NumberFormat.getCurrencyInstance(locFR); //French Currency
for (NumberFormat nf : nfa){
System.out.println("----------- " + nf.getClass().getName() + "-----------------------");
System.out.println("Default maximum fraction digits : " + nf.getMaximumFractionDigits());
System.out.println(nf.format(f1));
nf.setMaximumFractionDigits(5);
System.out.println("Maximum fraction digits updated to : " + nf.getMaximumFractionDigits());
System.out.println(nf.format(f1));
try{
nf.setMaximumFractionDigits(5);
System.out.println("parsed string: " + nf.parse("1234.56732"));
nf.setParseIntegerOnly(true);
System.out.println("after setParseIntegerOnly" + nf.parse("1234.567"));
}catch (Exception e){e.printStackTrace();};
Run Code Online (Sandbox Code Playgroud)
以上的输出是
----------- java.text.DecimalFormat-----------------------
Default maximum fraction digits : 3
123.457
Maximum fraction digits updated to : 5
123.45678
parsed string: 1234.56732
after setParseIntegerOnly1234
----------- java.text.DecimalFormat-----------------------
Default maximum fraction digits : 3
123,457
Maximum fraction digits updated to : 5
123,45678
parsed string: 1234
after setParseIntegerOnly1234
----------- java.text.DecimalFormat-----------------------
Default maximum fraction digits : 2
ú123.46
Maximum fraction digits updated to : 5
ú123.45678
java.text.ParseException: Unparseable number: "1234.56732"
at java.text.NumberFormat.parse(Unknown Source)
at TwoMinuteDrillTests.doExamples(TwoMinuteDrillTests.java:859)
at TwoMinuteDrillTests.main(TwoMinuteDrillTests.java:871)
----------- java.text.DecimalFormat-----------------------
Default maximum fraction digits : 2
123,46 ñ
Maximum fraction digits updated to : 5
123,45678 ñ
java.text.ParseException: Unparseable number: "1234.56732"
at java.text.NumberFormat.parse(Unknown Source)
at TwoMinuteDrillTests.doExamples(TwoMinuteDrillTests.java:859)
at TwoMinuteDrillTests.main(TwoMinuteDrillTests.java:871)
Run Code Online (Sandbox Code Playgroud)
看起来解析数字很好但是在使用两个货币实例时它很窒息:
nfa[2] = NumberFormat.getCurrencyInstance(); //Default Currency
nfa[3] = NumberFormat.getCurrencyInstance(locFR); //French Currency
Run Code Online (Sandbox Code Playgroud)
还有一种方法可以找出for循环中正在处理的对象的类型是什么?我nf.getClass().getName()
在上面的例子中使用过,但它总是返回泛型类型DecimalFormat
.我希望能够知道它是在处理货币实例还是数字实例.
提前致谢.
因为当你解析货币时,字符串也应该包含货币符号,例如$表示美国语言环境和卢比.对于印度语的地方.
例如在印度本地,这解析很好:nf.parse("Rs.1234.56732")
但是这失败了nf.parse("1234.56732
").所以基本上,在你的例子中,你需要附加带有Franc符号的符号以便成功解析.
此外,我看不到任何直接的方法来确定DecimalFormat对象是否是货币实例,因为用于此的字段isCurrencyInstance
在DecimalFormat类中被声明为private并且没有getter.