帮助我了解此代码的工作原理。它基本上将逗号添加到一串数字中。因此,如果用户键入1到3位数字,它将保持不变。对于四位数字,它会添加逗号
等等。这是代码:
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
循环,因为:
if
循环中的nDigits
代码, 1
以nDigits++
开头,那么它如何将逗号放在三位而不是两位数之后呢?它是如何知道何时只有4或5位数字将逗号正确地放在第1位和第2位(1,111 - 11,111)?
答案 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;
这是实际数字
通过运行
在第三次迭代中连接第二个charresult = "," + result;
是订单分隔符
实现根本不是最优的,因为在Java中,字符串是不可变的,result = "," + result;
最终会创建一个新对象。 StringBuffer
或StringBuilder
对此目的更为有效。
答案 3 :(得分:0)
for (int i = len - 1; i >= 0; i--)
i
以len - 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();
}