Java 如何根据区域设置设置数字格式,同时保留所有小数点?
我试图使用十进制格式转换双精度值的十进制分隔符,同时保留原始数字的所有小数。例如,DecimalFormatter接受格式为“0.##”的模式。由于我必须使用带有不同小数的数字,这将不起作用,但是,因为小数的数量总是需要在模式中指定 我正在寻找一种方法来解决这个问题 我试过String.format。分词格式和数字格式 理想情况下,我想要的是:Java 如何根据区域设置设置数字格式,同时保留所有小数点?,java,format,Java,Format,我试图使用十进制格式转换双精度值的十进制分隔符,同时保留原始数字的所有小数。例如,DecimalFormatter接受格式为“0.##”的模式。由于我必须使用带有不同小数的数字,这将不起作用,但是,因为小数的数量总是需要在模式中指定 我正在寻找一种方法来解决这个问题 我试过String.format。分词格式和数字格式 理想情况下,我想要的是: private static final ThreadLocal< DecimalFormat > formatter = new Th
private static final ThreadLocal< DecimalFormat > formatter = new ThreadLocal< DecimalFormat >()
{
@Override
protected DecimalFormat initialValue()
{
// n should be any number of decimals without having to specify them.
return new DecimalFormat("0.0#n");
}
};
结果:
2,456 -> Good
2,100 -> Not good
我想设置一个pattern/regex,它适用于十进制分隔符后任意位数的双精度,如:
2,456 -> Good
2,1 -> Good
3,3453456345234 -> Good
Java中的数字(通常只有数字)没有固定的小数位数<代码>1.1、1.10
和1.100
都是完全相同的数字
您可以了解默认格式将使用多少个位置,例如:
String str = num.toString();
int decimal = str.indexOf('.');
int places = decimal <= 0 ? 0 : str.length - decimal;
String str=num.toString();
int decimal=str.indexOf('.');
int places=decimal
double[] floats = { 3.20, 4.500, 6.34, 1.0000 };
BigDecimal[] fixeds = {
new BigDecimal("3.20"),
new BigDecimal("4.500"),
new BigDecimal("6.34"),
new BigDecimal("1.0000")
};
并希望将其格式化为这样的格式,但已本地化
好消息是带有BigDecimal的定点数字保持了精度(使用字符串构造函数)。坏消息是,浮点始终是一个近似值,是2的(负)次幂和。所以3.20实际上可能是3.19999987或3.20000043
它们没有固定的小数。即使没有近似误差3.2==3.20==3.200
因此,转换为BigDecimal(非常难看),并消除近似误差:1000*3.2!=3200.0
BigDecimal value = new BigDecimal("5.1000");
NumberFormat df = NumberFormat.getInstance(Locale.KOREA);
df.setMinimumFractionDigits(value.getScale()); // 4
String s = df.format(value);
有16个用于控制输出。您在构造函数中指定的模式字符串只是设置大多数值的一种方便方法
要控制输出的区域设置,您可以在构造函数或中指定
由于您需要无限小数位,而且似乎至少需要一个小数位,因此需要调用setter方法,因为无法使用模式字符串指定unlimited
范例
输出(OpenJDK 11.0.1)
“…保留原始数字的所有原始小数点…”一个数字最多只能有一个小数点(取决于区域性,可能是
或,
等)。一个数字可能有多个分组分隔符(“千”分隔符在大多数英语语言环境中,但并非所有文化都以相同的方式分组)(也可以是
或,
甚至是一个空格),但只有一个小数点。你是说分组分隔符吗?还是小数点?单独:请显示示例编号、您得到的格式不正确的编号以及它们*应该*是什么样子。抱歉造成混淆。我更正了原来的帖子。我指的是分隔符后面的数字。:-)英文术语是“小数点”(但小数点后面的数字也适用)。但请再次提供示例、您得到的不正确输出以及正确的输出。@AthraelSoju重新阅读Crowder的第一条评论。您继续混淆小数分隔符(用于分隔数字的小数部分和整数部分)和分组分隔符(用于更容易读取整数部分)。@AthraelSoju我假设您仍然希望小数点后至少有一位数字?否则新的十进制格式(“”
似乎给出了所需的行为?
BigDecimal value = new BigDecimal("5.1000");
NumberFormat df = NumberFormat.getInstance(Locale.KOREA);
df.setMinimumFractionDigits(value.getScale()); // 4
String s = df.format(value);
private static void test(Locale locale) {
DecimalFormat fmt = new DecimalFormat("0.0", DecimalFormatSymbols.getInstance(locale));
//fmt.setMaximumIntegerDigits(Integer.MAX_VALUE); // already set by pattern
//fmt.setMinimumIntegerDigits(1); // already set by pattern
//fmt.setMinimumFractionDigits(1); // already set by pattern
fmt.setMaximumFractionDigits(Integer.MAX_VALUE);
//fmt.setGroupingUsed(false); // already set by pattern
System.out.println(locale.toLanguageTag() + " (" + locale.getDisplayLanguage(Locale.US) +
" - " + locale.getDisplayCountry(Locale.US) + ")");
System.out.println(" " + fmt.format(123456789));
System.out.println(" " + fmt.format(2.456));
System.out.println(" " + fmt.format(2.1));
System.out.println(" " + fmt.format(3.3453456345234));
}
public static void main(String[] args) {
test(Locale.US);
test(Locale.GERMANY);
test(Locale.forLanguageTag("ar-EG"));
}
en-US (English - United States)
123456789.0
2.456
2.1
3.3453456345234
de-DE (German - Germany)
123456789,0
2,456
2,1
3,3453456345234
ar-EG (Arabic - Egypt)
١٢٣٤٥٦٧٨٩٫٠
٢٫٤٥٦
٢٫١
٣٫٣٤٥٣٤٥٦٣٤٥٢٣٤