Java 该代码如何在每三位数字之前添加逗号?

Java 该代码如何在每三位数字之前添加逗号?,java,math,Java,Math,帮助我理解这段代码是如何工作的。它本质上是将逗号添加到一个数字字符串中。因此,如果用户键入一个1到3位数的数字,它将保持不变。对于四位数字,它会添加一个逗号 1111变为1111 11111变为11111 111111111变为11111111 等等。代码如下: private String addCommasToNumericString (String digits) { String result = ""; int len = digits.length();

帮助我理解这段代码是如何工作的。它本质上是将逗号添加到一个数字字符串中。因此,如果用户键入一个1到3位数的数字,它将保持不变。对于四位数字,它会添加一个逗号

  • 1111变为1111
  • 11111变为11111
  • 111111111变为11111111
等等。代码如下:

private String addCommasToNumericString (String digits)
{
    String result = "";
    int len = digits.length();
    int nDigits = 0;

    for (int i = len - 1; i >= 0; i--)                      
    {
        result = digits.charAt(i) + result;                 
        nDigits++;                                          
        if (((nDigits % 3) == 0) && (i > 0))                
        {
            result = "," + result;
        }
    }
    return (result);
}
我会解释我对它的理解

for
循环基本上计算用户写入的数字的长度,以避免在第一个数字(例如1111)前加逗号。当
i
小于字符串的长度时,它减去
1

result
返回位置
i
处的字符,因为它向下计数,所以从右向左返回“相反”的字符

nDigits
在循环的每次迭代中,将1 from添加到
0
的初始值

我想现在我很难准确地看到发生了什么:
if(“nDigits%3)==0

因此,对于通过循环的两个第一次迭代,它不会执行
if
循环,因为:

  • 1%3=1
  • 2%3=2
  • 3%3=0
nDigits
一开始是
1
,因为
nDigits++
代码在
for
循环中,所以它如何将逗号放在三位数字之后而不是两位?它如何知道何时只有4位或5位数字将逗号正确地放在位置1和位置2(1111-11111)


i
len-1
开始,从最后一个数字开始。
中的
i>0
如果((nDigits%3)==0)和&(i>0))
是在第一个数字(例如1111)之前避免使用逗号的数字。

我认为解释这一点的最简单方法是将速度降低到每一次

循环从字符串的末尾开始,因此如果您有字符串12345,那么在第一次通过循环之后,结果将是“5”,ndigit将是1

下一次通过时,“4”将添加到结果的前面,给出“45”,ndigit将为2

第三次到,它在结果的前面加上“3”,使之成为“345”,然后if触发并在前面加上逗号。结果现在是“345”

更多通行证将为您提供“12345”

我想让你困惑的是,循环从“5”开始,而不是从“1”开始。所有内容都添加到结果的前面,而不是像你通常期望的那样添加到结尾


希望这有帮助!

基本上,这是从数字的最后一位开始,从右到左迭代,将它们放在
结果
字符串的前面,并在每3个字符中加一个逗号


在这个特定的代码中,
len
保存数字的总长度,
nDigits
是已经计算了多少个数字的计数。从位置
len-1
开始(即数字的最后一个数字的索引),for循环迭代通过位置0(数字的第一个数字)。它在
i
位置获取数字,将其放在
结果
字符串的前面,然后计算其前面是否应该有逗号。
nDigits%3
将每三位返回0,因此
if
语句通过检查是否有三位数字被写入和删除来计算是否应该有逗号您刚才编写的不是0。

变量
result
用于最终输出的增量构建,在每次迭代中,从左到右连接一个或两个字符(即字符串是从右到左构建的)

  • 每次运行时都会连接一个字符

    result = digits.charAt(i) + result;  
    
    result = "," + result;
    
    它是实际的数字

  • 第二个字符通过运行

    result = digits.charAt(i) + result;  
    
    result = "," + result;
    
    这是订单分隔符


该实现根本不是最优的,因为在Java中字符串是不可变的,
result=“,“+结果以创建新对象结束。
StringBuffer
StringBuilder
在这方面更有效。

此方法的关键是从右到左计数数字。如果你不那样做,它就不会起作用

您也可以使用字符串操作而不是字符操作来执行相同的操作。也许这样更容易理解,所以我将提供一个例子

我的解决方案包括使用子字符串方法,并以与您类似的方式进行操作。从右到左开始,它将原始字符串分为两个子字符串,并在每有一个3位数的组时在它们之间添加一个逗号

private String addCommas (String digits) {

    String result = digits;

    if (digits.length() <= 3) return digits; // If the original value has 3 digits or  less it returns that value

    for (int i = 0; i < (digits.length() – 1) / 3; i++) {

      int commaPos = digits.length() – 3 – (3 * i); // comma position in each cicle

      result = result.substring(0, commaPos) + "," + result.substring(commaPos);
    }
   return result;
}
private String addCommas(字符串数字){
字符串结果=数字;

如果(digits.length()出于我的目的,我修改了@Antonio Ricardo Diegues Silva的答案

/**
 * Get number in {@link String} with divider after 'n' number of digits
 * @param number number for processing
 * @param n amount after which will be inserted divider
 * @return {@link String} number with dividers
 */
public static <T extends Number> String insertDividerBetweenEveryNDigits(T number, int n, String divider) {
    StringBuilder builder = new StringBuilder().append(number);
    int digitsNumber = builder.length();
    if (digitsNumber > n) { // If the original value has n digits or less it just returns that value
        for (int i = 1; i <= (digitsNumber - 1) / n; i++) {
            int dividerPos = digitsNumber - (n * i); // divider position in each cycle
            builder.insert(dividerPos, divider);
        }
    }
    return builder.toString();
}
/**
*获取{@link String}中的数字,数字的“n”个数后带有分隔符
*@param number用于处理
*@param n之后将插入分隔符的金额
*@return{@link String}带分隔符的数字
*/
EverynDigits之间的公共静态字符串InsertDivider(T编号、整数n、字符串分隔符){
StringBuilder=新建StringBuilder().append(编号);
int digitsNumber=builder.length();
如果(DigitNumber>n){//如果原始值有n个或更少的数字,则只返回该值

对于(int i=1;我感谢,这说明了这一点……我看到它非常简单。这段代码太糟糕了。你最好不要理解它。代码从右边开始,然后向左边运行。这意味着任何插入都发生在代码下一步看的地方之后。