0

ユーザーが入力した文字列があります25|35|40。私は100=25+35+40このフォーマットに以下の任意の数をフォーマットしています。例えば、

5  --> 05|00|00
30 --> 25|05|00
65 --> 25|35|05

25 | 35|40の順序を維持する必要があります。これは、日付のフォーマットMM:dd:yyyyに似ており、月は12を超えてはならず、日付は31を超えてはなりません。ただし、ここでは任意の値が発生する可能性があります。その位置の値が最大値を決定します。もう一つの例、

ユーザー文字列が40|110|2500|350

5    --> 05|000|0000|000
100  --> 40|060|0000|000
450  --> 40|110|0300|000
2900 --> 40|110|2500|250

合計を超える場合は、3000=40+110+2500+350として作成できますnumber -= 3000。現在、番号をチェックして必要な出力文字列を作成するカスタムコードを使用してフォーマットしようとしています。Javaで利用可能な組み込みフォーマットAPIはありますか?

4

1 に答える 1

0

このような特定のユースケース向けのパブリック API はありません。これはそれを解決する1つの方法です:

int num = 65;
int i1 = num > 25 ? 25 : num;
int i2 = num < 25 ? 0 : num > 60 ? 35 : num - 25;
int i3 = num < 60 ? 0 : num - 60;
System.out.format("%02d|%02d|%02d", i1, i2, i3);

版画

25|35|05

または、それを一般化するには:

public static String format(String format, int num) {
    String[] split = format.split("\\|");
    int numLeft = num;
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < split.length; i++) {
        int boundary = Integer.parseInt(split[i]);
        int number = Math.min(numLeft, boundary);
        if (result.length() > 0) {
            result.append('|');
        }
        result.append(leftPad(number, split[i].length()));
        numLeft = Math.max(0, numLeft - boundary);
    }
    return result.toString();
}

private static String leftPad(int number, int length) {
    StringBuilder sb = new StringBuilder();
    sb.append(number);
    while (sb.length() < length) {
        sb.insert(0, '0');
    }
    return sb.toString();
}

public static void main(String[] args) {
    String result = format("25|35|40", 65);
    System.out.println(result);
}
于 2012-07-25T08:29:56.757 に答える