Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不舍入的情况下格式化字符串数字?_Java_Algorithm_Number Formatting - Fatal编程技术网

Java 如何在不舍入的情况下格式化字符串数字?

Java 如何在不舍入的情况下格式化字符串数字?,java,algorithm,number-formatting,Java,Algorithm,Number Formatting,我的要求是,用户应该能够从表单中输入任何有效的数字(数字将是字符串)。应用程序应使用逗号将字符串编号格式化为US格式,而不进行任何舍入。此格式化数字将打印在一封信中,并邮寄给客户。大多数数字格式化程序将在指定的精度后对数字进行四舍五入。这在Java中是必需的,但任何语言中的任何算法都可以。我可以将其编码为Java 示例: Input Output -1.0 -1.0 123 123 1234

我的要求是,用户应该能够从表单中输入任何有效的数字(数字将是字符串)。应用程序应使用逗号将字符串编号格式化为US格式,而不进行任何舍入。此格式化数字将打印在一封信中,并邮寄给客户。大多数数字格式化程序将在指定的精度后对数字进行四舍五入。这在Java中是必需的,但任何语言中的任何算法都可以。我可以将其编码为Java

示例:

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