0

かなり大きな数(BigIntegerが大きい)を表示するプログラムを作成しようとしています。ユーザーが使いやすいように、数字を文字列(1 000 000 = 1 Million)で表示しています。以下のコードは、私の現在の試みを示しています。私の問題は、私が交換する実際の数が良くて丸くないという事実にあります。このプログラムは、100%正確な値を表示する必要はなく、ボールパークの数値を表示します。IE:

1 234 567 = 1 Million
1 000 000 = 1 Million
1 934 234 = 1 Million

私の現在のコード(簡潔にするために短縮):

            if (!displayNumbers) {
                StringBuffer sb = new StringBuffer(_combinations);
                String t = sb.reverse().toString();

                Toast.makeText(getApplicationContext(), t, 1).show();

                ...

                if (t.contains("000 000 000 000 000")) {
                    t.replace("000 000 000 000 000", "quadrillion");
                }

                if (t.contains("000 000 000 000")) {
                    t.replace("000 000 000 000", "trillion");
                }

                if (t.contains("000 000 000")) {
                    t.replace("000 000 000", "billion");
                }

                if (t.contains("000 000")) {
                    t.replace("000 000", "million");
                }

                sb = new StringBuffer(t);
                _combinations = sb.reverse().toString();
            }

ゼロを置き換えるという方針に沿って、対応する単語を#'s検索しx lots of 3 digitsて置き換えるように考えていましたが、これを実装する方法がわかりません。million, billion, etcまた、現在、最終的な出力文字列でスペルト小麦が逆になっていることにも注意してください。

編集:英国の読者のために、私が米国の定義を使用していることに注意する必要があり*illionsます。

編集2:もう少しグーグルをしていてこれを見つけました-java正規表現:すべての数値を1つの数値に置き換えます。を見つけるために正規表現を変更する方法がわからないことを除いて000 000

4

5 に答える 5

0

あなたの番号(テキスト)は表示のみを目的としています。数値を文字列に変換した後で操作することはお勧めできません。

テキストを整数に解析し、適切な表示方法でフォーマットしてみませんか。 これがあなたが見ておくべき例です

于 2013-01-30T09:52:09.980 に答える
0

1000を超える数値を有効数字1桁に丸める実装例。

オプションで、3桁のグループをコンマまたはスペースで区切ることができます。

private final static String[] illions = { 
    "m", "b", "tr", "quadr", "quint", "sext", "sept", "oct", "non", "dec",
    "undec", "duodec", "tredec", "quattuordec", "quindec", "sexdec",
    "septendec", "octodec", "novemdec", "vigint", "unvigint", "duovigint", 
    "trevigint", "quattuorvigint", "quinvigint", "sexvigint", "septenvigint",
    "octovigint", "novemvigint", "trigint", "untrigint", "duotrigint" 
};

private static String approximate( String n ) {  
    String approx = n;

    if ( n != null && n.matches( "^\\d{1,3}[\\s,]?(\\d{3}[\\s,]?)*\\d{3}$" ) ) {  
        n = n.replaceAll( "[\\s,]", "" );            
        int i = n.length() + 2;

        if ( i < 105 ) {
            int rnd = (int) Math.round( Double.parseDouble( n.substring( 0, 2 ) ) / 10 )
                    * (int) Math.pow(10, i % 3);
            n = i > 8 ? illions[ i / 3 - 3 ] + "illion" : "thousand";   
            approx = rnd  + " " + n;
        }
    }

    return approx;
}

テスト

System.out.printf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s",
    approximate("999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"),  // "1000 duotrigintillion"    
    approximate("4857476486598746598743265987426598724365987265987324598726598734625987564987456"),  // "5 quinvigintillion"
    approximate("56843584275874587243582837465847326554"),  // "60 undecillion"
    approximate("1 345 678 910 111 213"),                   // "1 quadrillion"
    approximate("47,648,658,437,651"),                      // "50 trillion"
    approximate("9 891 011 123"),                           // "10 billion"
    approximate("687654321"),                               // "700 million"
    approximate("32 456 999"),                              // "30 million"
    approximate("2,678,910"),                               // "3 million"
    approximate("1 234 567"),                               // "1 million"
    approximate("123456"),                                  // "100 thousand"
    approximate("17,654"),                                  // "20 thousand"
    approximate("8765"),                                    // "9 thousand"
    approximate("654")                                      // "654"
);      
于 2013-01-30T11:31:14.837 に答える
0

これを修正する方法についての提案を手伝ってくれた他のすべての人に感謝したいと思います。それらはすべて可能であると確信しています。ただし、最善の方法は、BigInteger を文字列に変換し、空白を追加しないことであることがわかりました。

文字列の長さが 6 未満の場合はそのままにして、外観のために空白を追加しました。6 よりも長い場合は、文字列の長さの Mod に応じて最初の 1、2、または 3 つの数字を取り、それらを実際の数字として使用して最初に表示しました (100 万、340 億、124 兆など)。

次に、残りの文字列の長さを確認し、特定の量よりも長い場合は、表示テキストに文字列を追加するだけでした。

これについて説明が必要な人がいたら、遠慮なく私に聞いてください! ここにペーストビンへのリンクがあります - http://pastebin.com/3X681UkG

幸運を!

于 2013-01-30T11:07:41.563 に答える
0

if ステートメントと else ステートメントを使用してそれを行うことができます。私が理解していることから、正確な表現を探しているわけではないため、1400000 に対して 100 万と言っても問題ありません。そのためには、次のようなコードを使用できます。

int myValue
String txt = null;
if (myValue> 500 000 000){
       txt = String.ValueOf((int) myValue/1000000000) + " Billion"
} else if (myValue> 500 000){
       txt = String.ValueOf((int) myValue/1000000) + " Million"
} else if (myValue> 500) {
       txt = String.ValueOf((int) myValue/1000) + " Thousand"
} 

これは、説明している単純な使用法で機能するはずです。

于 2013-01-30T09:50:23.723 に答える