Java 如何在不舍入的情况下格式化字符串数字?
我的要求是,用户应该能够从表单中输入任何有效的数字(数字将是字符串)。应用程序应使用逗号将字符串编号格式化为US格式,而不进行任何舍入。此格式化数字将打印在一封信中,并邮寄给客户。大多数数字格式化程序将在指定的精度后对数字进行四舍五入。这在Java中是必需的,但任何语言中的任何算法都可以。我可以将其编码为Java 示例:Java 如何在不舍入的情况下格式化字符串数字?,java,algorithm,number-formatting,Java,Algorithm,Number Formatting,我的要求是,用户应该能够从表单中输入任何有效的数字(数字将是字符串)。应用程序应使用逗号将字符串编号格式化为US格式,而不进行任何舍入。此格式化数字将打印在一封信中,并邮寄给客户。大多数数字格式化程序将在指定的精度后对数字进行四舍五入。这在Java中是必需的,但任何语言中的任何算法都可以。我可以将其编码为Java 示例: Input Output -1.0 -1.0 123 123 1234
Input Output -1.0 -1.0 123 123 1234 1,234 123456 123,456 -123456 -123,456 -123456.01 -123,456.01 1234.79999999 1,234.79999999 1234567.79999999 1,234,567.79999999 -1234567.79999999 -1,234,567.79999999 结果
-123456.799999
说明:
nf.setMaximumFractionDigits(n)代码>
将此设置为要显示的最大位数。逗号后的所有位数小于等于此位数的数字将按照您的要求显示。只有逗号后位数更多的数字才会四舍五入
使用字符串concat编辑大数字
String number = "-12342342353356.799999123456789";
int startIndex = number.length()-3;
if(number.indexOf(".") >= 0) {
startIndex = number.indexOf(".") - 3;
}
int negative = (number.charAt(0) == '-' ? 1 : 0);
for (int i = startIndex; i > 0 + negative; i -= 3) {
number = number.substring(0, i) + "," + number.substring(i);
}
System.out.println(number);
结果:-12342342353356.79999123456789
您需要的是:
NumberFormat format = NumberFormat.getNumberInstance(Locale.US);
format.setMaximumFractionDigits(Integer.MAX_VALUE);
System.out.println(format.format(Double.valueOf("2.10")));
System.out.println(format.format(Double.valueOf("11220.999")));
System.out.println(format.format(Double.valueOf("-1234567.79999999")));
输出:
2.1
11,220.999
-1,234,567.79999999
-999,999,999.999999
对于较大的字符串,您可能需要使用
输出
-999,999,999.99999999999999999999
结果:
-999,999,999.999999
999,999,999,999,999.9999999999998881928391283
将很长的数字作为字符串处理的另一种方法
String number = "999999999999999.9999999999998881928391283";
BigDecimal bd = new BigDecimal(number);
NumberFormat format = NumberFormat.getNumberInstance();
StringBuilder sb = new StringBuilder();
sb.append(format.format(bd.longValue()));
int index = number.indexOf('.');
if (index > -1) {
sb.append(number.substring(index));
}
System.out.println(sb);
结果:
-999,999,999.999999
999,999,999,999,999.9999999999998881928391283
@PhamTrung的可能重复项它是一个重复项Ibelieve@PhamTrung我需要更多的“原样”格式。如果将格式模式定义为“#.0000”,那么2.1将为您提供2.1000。我需要2.1.2操作字符串(如果作为正则表达式)。不要转换为Number
并返回。如果您转换为任何浮点类型并返回,那么您将必然丢失长数字末尾的一些数字。例如,假设用户输入了一个100万位数的数字——这些数字不可能在一个8字节的double
中表示出来。如果输入-99999999.9999999,结果显示-99999999.999998。有没有办法把最后的8分变成9分呢?这就够了。如果你需要更大的数字,你需要另一个解决方案。你的方法不好。123.123456789012怎么样?显示的小数位数不会超过10位。OP希望值保持原样,只添加逗号“精度未定义。它应按原样显示;但仅限于格式。如果用户给出2位小数,则应给出2位小数的输出。如果为5,则为5”。此外,double不能正确表示大多数十进制数固定为大数最后一个四舍五入:(@RakeshGaria查看我的更新答案,它将解决您的问题。
String number = "999999999999999.9999999999998881928391283";
BigDecimal bd = new BigDecimal(number);
NumberFormat format = NumberFormat.getNumberInstance();
StringBuilder sb = new StringBuilder();
sb.append(format.format(bd.longValue()));
int index = number.indexOf('.');
if (index > -1) {
sb.append(number.substring(index));
}
System.out.println(sb);
999,999,999,999,999.9999999999998881928391283