Java 为什么IDR的Currency.defaultFractionDigits()对于android是0?

Java 为什么IDR的Currency.defaultFractionDigits()对于android是0?,java,android,localization,currency,Java,Android,Localization,Currency,对于印尼货币(IDR),defaultFractionDigits()在Android应用程序中为我提供0 Locale locale = new Locale("in", "ID"); Currency currency = Currency.getInstance(locale); Log.d("TEST",String.format(locale, "Currency - %s ( %s ) Decimal - %s ", currency.getSymbol(local

对于印尼货币(IDR),
defaultFractionDigits()
在Android应用程序中为我提供
0

Locale locale = new Locale("in", "ID");
Currency currency = Currency.getInstance(locale);
Log.d("TEST",String.format(locale, "Currency - %s ( %s )  Decimal - %s ",
        currency.getSymbol(locale),
        currency.getSymbol(),
        currency.getDefaultFractionDigits()));
D/测试:货币-卢比(印尼盾)十进制-0

当我在eclipse中测试它时(也在eclipse中),我得到了
2

符号:Rp

默认小数位数:2

两者的文件均表明其为ISO 4217(ISO 4217:2015列出了带两位小数点的IDR)


为什么Android应用程序的
0

我认为在第一个示例中,您只是误用了
String.format()
,并且由于Android无法正确启动autobox而被烧掉了

你有:

Log.d("TEST",String.format(locale, "Currency - %s ( %s )  Decimal - %s ",
    currency.getSymbol(locale),
    currency.getSymbol(),
    currency.getDefaultFractionDigits()));
请注意,格式中的第三个替换参数是
%s
。在代码中,调用
currency.getDefaultFractionDigits()
来填充该值。该方法返回一个
int
我现在没有运行android应用程序,所以我不能确定格式会如何响应,但通常它可能不喜欢被传递一个整数
%d
将是
String.format()
调用中更合适的参数

然而,当我在一个纯Java8环境中运行它时(为了方便起见,我将它塞进JUnit测试中),它会愉快地返回“2”

答复如下:

货币-卢比(印尼盾)十进制-2

似乎
currency.getDefaultFractionDigits()
返回的
int
已自动装箱为整数,很高兴调用了
.toString()

总之 我不认为货币的实际反应有根本性的区别,而是你印刷它的方式和环境的怪癖

我建议至少尝试一下
%d
,如下所示:

Log.d("TEST",String.format(locale, "Currency - %s ( %s )  Decimal - %d ",
    currency.getSymbol(locale),
    currency.getSymbol(),
    currency.getDefaultFractionDigits()));

我在Android Studio 3.0.1中使用JRE 1.8.0_152运行了以下jUnit代码:

@Test
public void defaultFractionDigits_isCorrect() throws Exception {
    Locale locale = new Locale("in", "ID");
    Currency currency = Currency.getInstance(locale);
    assertEquals(2, currency.getDefaultFractionDigits());
}

@Test
public void defaultFractionDigits2_isCorrect() throws Exception {
    Locale locale = new Locale("in", "ID");
    Currency currency = Currency.getInstance(locale);
    assertEquals("Currency - Rp ( IDR )  Decimal - 2 ",
            String.format(locale, "Currency - %s ( %s )  Decimal - %s ",
            currency.getSymbol(locale),
            currency.getSymbol(),
            currency.getDefaultFractionDigits()));
}
两项测试都通过了。然后,我运行此测试以检查您得到的结果:

@Test
public void defaultFractionDigits3_isCorrect() throws Exception {
    Locale locale = new Locale("in", "ID");
    Currency currency = Currency.getInstance(locale);
    assertEquals("Currency - Rp ( IDR )  Decimal - 0 ",
            String.format(locale, "Currency - %s ( %s )  Decimal - %s ",
            currency.getSymbol(locale),
            currency.getSymbol(),
            currency.getDefaultFractionDigits()));
}
测试失败,原因是:

org.junit.ComparisonFailure: 
Expected :Currency - Rp ( IDR )  Decimal - 0 
Actual   :Currency - Rp ( IDR )  Decimal - 2 
所以当我单独测试它时,我并没有看到你们所看到的。也许是别的什么东西把事情搞砸了?还是我没有正确回答这个问题

更新:

当我在运行SDK 24的emulator(Android测试)中运行相同的测试时,我得到了与您相同的结果:

expected:<2> but was:<0>
expected:<... ( IDR )  Decimal - [2] > but was:<... ( IDR )  Decimal - [0] >
应为:但为:
预期:但是:
在一个实际的星系S7上得到了同样的结果。。。好像有什么东西…

试试这个:

int hargarumah = 66000000;
Locale localeID = new Locale("in", "ID");
NumberFormat formatRupiah = NumberFormat.getCurrencyInstance(localeID);
textview.setText(formatRupiah.format((double)hargarumah));

谷歌似乎有意或无意地在安卓10上解决了这个问题。 因此,在android 10上,Currency的
defaultFractionDigits
方法将为
IDR
返回
2
,但在android 9或更低版本上,它将继续返回
0


因此,我们在
UI
上设置
IDR
格式的整个功能都崩溃了,我们不得不在客户端自己处理:(

你的Android代码使用“in”语言环境,而不是“id”Oops,发布时出错。两者都是“in”。现在更新了问题,描述不正确,根据子单元(sen)可能与此相关)是否过时ISO 4217有f.e版本最新版本为ISO 4217:2015(),也许Android和其他系统上有不同的版本system@Wrobel即使sen在现金支付中事实上已经过时,ISO 4217:2015仍将印尼盾列为具有两位数分数的子单位。尽管如此,它仍用于会计和银行转账。这不是格式问题,
assertEquals(0,currency.getDefaultFractionDigits())
正在传入android。问题是我在其他jre中以
2
的形式得到它,其中as
0
在android@LetsRefactor我无法想象你为什么会否决我。我写的没有错,你通过断言专门在android中测试值是你刚才提供的新信息。你的数据确实表明est在android中是一个更深层次的问题,但由于您选择不提供任何版本细节,从我的角度来看,这不是一个可行的方法。我相信我在问题中提供了足够的信息。代码是用来描述这个问题的,我清楚地提到它在android中发生。不幸的是,您的答案是sug将其视为
String.format()
问题,这显然不是。Java不会仅仅因为在
字符串.format()中使用了
%s
而将值为
2
int
转换为
0
因此,很抱歉,这个答案是不可接受的。FWIW..不是您想要的答案(这显然只是某个地方的一个bug)和不合适或偏离目标的答案(这是向下投票的目的)之间有区别.Hey@Kaamel,你用android应用程序测试过吗?或者用应用程序测试过仪器测试过吗?如果是,你能用android SDK版本和设备/模拟器版本详细信息更新它吗?对我来说,我用Pixel C emulator、Samsung Tab A和HTC OneGood point得到
0
。我实际上只对它进行了单元测试(没有模拟器).当我有机会在模拟器中进行Android测试时,我会更新我的响应故事。
expected:<2> but was:<0>
expected:<... ( IDR )  Decimal - [2] > but was:<... ( IDR )  Decimal - [0] >
int hargarumah = 66000000;
Locale localeID = new Locale("in", "ID");
NumberFormat formatRupiah = NumberFormat.getCurrencyInstance(localeID);
textview.setText(formatRupiah.format((double)hargarumah));