6

このコードがどのように機能するかを理解するのを手伝ってください。基本的に、数値の文字列にコンマを追加します。したがって、ユーザーが1〜3桁の数字を入力しても、変更されません。4桁の数字の場合、カンマを追加します。

  • 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にある文字を返します。下向きにカウントするため、右から左に向かって「反対」の文字を返します。

nDigits0ループの各反復での初期値に1を追加します。

私は今、私が何が起こっているのかを正確に見るのに苦労しているところだと思います:if ("nDigits % 3) == 0

ifしたがって、ループを介した最初の2回の反復では、次の理由でループが実行されません。

  • 1%3 = 1
  • 2%3 = 2
  • 3%3 = 0

nDigitsループ内のコード1のために開始しますが、2桁ではなく3桁の後にコンマを配置するにはどうすればよいですか?そして、位置1と2(1,111〜11,111)にコンマを正しく配置するのに4桁または5桁しかない場合、どのようにしてわかりますか?nDigits++for

4

6 に答える 6

6

これを説明する最も簡単な方法は、パスごとに速度を落とすことだと思います。

ループは文字列の最後から始まるため、文字列12345がある場合、最初にループを通過した後、結果は「5」になり、nDigitsは1になります。

次回は、結果の前に「4」が追加されて「45」になり、nDigitsは2になります。

3回目は、結果の前に「3」を追加して「345」にし、if-thenをトリガーして、前にコンマを追加します。結果は「、345」になりました。

パスを増やすと「12,345」になります。

混乱しているのは、ループが「1」ではなく「5」から始まることだと思います。通常予想されるように、すべてが結果の先頭に追加され、最後には追加されません。

お役に立てれば!

于 2012-09-15T21:19:23.780 に答える
2

この方法で重要なことは、右から左に桁を数えることです。そのようにしないとうまくいきません。

文字操作の代わりに文字列操作でも同じことができます。分かりやすいかもしれませんので、例を挙げてみます。

私の解決策には subString メソッドの使用が含まれ、あなたと同様の方法で動作します。FROM RIGHT TO LEFT から始めて、元の文字列を 2 つの部分文字列に分割し、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;
}
于 2013-05-21T20:03:49.177 に答える
1

変数resultは、最終出力の増分ビルドに使用されます。各反復で、1つまたは2つの文字が左から連結されます(つまり、文字列は右から左にビルドされます)。

  • 実行することにより、毎回1つの文字が連結されます

    result = digits.charAt(i) + result;  
    

    それは実際の数字です

  • 2番目の文字は、実行することにより、3回目の反復ごとに連結されます。

    result = "," + result;
    

    オーダーセパレーターです

result = "," + result;Javaでは文字列は不変であり、最終的に新しいオブジェクトを作成するため、実装はまったく最適ではありません。またははStringBufferStringBuilderこの目的にははるかに効果的です。

于 2012-09-15T21:21:26.780 に答える
0
for (int i = len - 1; i >= 0; i--)

i、で始まりlen - 1、最後の桁から開始します。i > 0inif (((nDigits % 3) == 0) && (i > 0))は、最初の数字の前のコンマを避けるものです(たとえば、1111)。

于 2012-09-15T21:17:27.900 に答える
0

基本的に、これは数値の最後の桁から開始し、右から左に繰り返し、result文字列の前に追加し、3文字ごとにコンマを挿入します。

この特定のコードでlenは、は数値の全長を保持し、nDigitsそれらの桁のうちすでに評価されている桁数のカウントです。位置len-1(つまり、数値の最後の桁のインデックス)から開始して、forループは位置0(数値の最初の桁)を繰り返します。位置にある数字を取得しi、それを文字列の前に置き、その前にresultコンマがあるかどうかを評価します。nDigits % 3は3桁ごとに0を返すため、ifステートメントは、3桁が書き込まれ、今書き込んだ桁が0でないかどうかを確認することにより、コンマが必要かどうかを評価します。

于 2012-09-15T21:20:48.410 に答える