这段代码如何在每三位数之前添加逗号?

时间:2012-09-15 21:06:05

标签: java math

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

  • 1111变为1,111
  • 11111变为11,111
  • 111111111成为11,111,111

等等。这是代码:

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}的初始值加1。

我想我现在无法确切地看到发生了什么:0

因此,对于第一次迭代循环,它不会执行if ("nDigits % 3) == 0循环,因为:

  • 1%3 = 1
  • 2%3 = 2
  • 3%3 = 0
由于if循环中的nDigits代码,

1nDigits++开头,那么它如何将逗号放在三位而不是两位数之后呢?它是如何知道何时只有4或5位数字将逗号正确地放在第1位和第2位(1,111 - 11,111)?

6 个答案:

答案 0 :(得分:6)

我认为最简单的解释方法是将其减慢到每次通过。

循环从字符串的结尾开始,所以如果你有字符串12345,那么在第一次循环结果后,结果将为“5”,nDigits将为1。

下一次,'4'将被添加到结果的前面,给你“45”,nDigits将是2。

第三次,它将“3”添加到结果的前面,使得“345”然后if-then触发并在前面添加逗号。结果现在是“,345”。

更多通行证会给你“12,345”。

我觉得令人困惑的是,循环从'5'开始而不是'1'。一切都被添加到结果的前面,而不是像你通常期望的那样。

希望这有帮助!

答案 1 :(得分:2)

此方法的关键是从右到左计算数字。如果你不这样做,它就行不通。

您也可以使用String Manipulation而不是char操作。也许它让它更容易理解,所以我将提供一个例子。

我的解决方案涉及使用subString方法,并以与您类似的方式操作。从RIGHT TO LEFT开始,它将原始String分为两个子串,并在每次有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;
}

答案 2 :(得分:1)

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

  • 每次运行

    连接一个字符
    result = digits.charAt(i) + result;  
    

    这是实际数字

  • 通过运行

    在第三次迭代中连接第二个char
    result = "," + result;
    

    是订单分隔符

实现根本不是最优的,因为在Java中,字符串是不可变的,result = "," + result;最终会创建一个新对象。 StringBufferStringBuilder对此目的更为有效。

答案 3 :(得分:0)

for (int i = len - 1; i >= 0; i--)

ilen - 1开头,从最后一位开始。 i > 0中的if (((nDigits % 3) == 0) && (i > 0))是在第一个数字之前避开逗号的那个(例如,1111)。

答案 4 :(得分:0)

基本上它的作用是从数字的最后一位开始,从右到左迭代,将它们添加到result字符串并在每3个字符中加一个逗号。

在此特定代码中,len包含数字的总长度,nDigits是已经评估了多少这些数字的计数。从位置len-1开始(所以数字的最后一位数的索引),for循环遍历位置0(数字的第一个数字)。它取位于i的数字,将其放在result字符串的前面,然后评估它前面是否应该有逗号。 nDigits % 3将每隔3位数返回0,因此if语句通过检查是否已写入3位数并且刚写入的数字不为0来评估是否应该有逗号。

答案 5 :(得分:0)

为了我的目的,我修改了@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();
}