0

次のクラスを検討してください。

public class DoubleSegment
{
    public int MinLength { get; }
    public int MaxLength { get; }

    public double Value { get; }

    public string GetString(CultureInfo culture)
    {
        return Value.ToString(culture); // this is the easy but incorrect way
    }
}

ご覧のとおり、長さの要件は完全に無視されています。これは明らかに間違っています。MinLength=4と があるMaxLength=4としましょうValue=954Valueに変換するにはどうすればよい"0954"ですか?

MinLength=4この解決策は、たとえば、MaxLength=10およびとも機能する必要があるValue=58723.9843ことに注意して"58723.9843"くださいculture == CultureInfo.InvariantCulture

4

4 に答える 4

2

パディングを使用して、文字列の 0 を埋めることができます。

int value = 324;

var paddedValue = value.ToString().PadLeft(4,'0'));
于 2013-06-26T11:28:29.263 に答える
1

これは、一見したよりも複雑です。次のことを考慮する必要があります。

  • 小数点は文字列の長さに含まれます
  • 小数点なしの文字列表現が最大長を超える場合、入力は無効ですが...
  • 文字列表現が小数点以下の最大長を超えるだけの場合は、単純に丸めることができます

私の解決策:

    public string GetString(CultureInfo culture) {
        var integral = (int)Math.Truncate(Value);
        var integralLength = integral.ToString().Length;

        if (integralLength > MaxLength) {
            throw new InvalidOperationException();
        }

        var integralWithDecimalSeparatorLength = integralLength + culture.NumberFormat.NumberDecimalSeparator.Length;
        var minimumFixedPointLength = integralWithDecimalSeparatorLength + 1;

        if (minimumFixedPointLength > MaxLength) {
            var intValue = (int)Math.Round(Value);
            return intValue.ToString("D" + MinLength, culture);
        } 

        var precision = MaxLength - integralWithDecimalSeparatorLength;
        return Value.ToString("F" + precision, culture);
    }

まず、値の整数部分 (小数を含まない) が長すぎる場合、値が大きすぎます。それ以外の場合、固定小数点 ("F") 文字列の書式設定に使用する精度は、残りの使用可能なスペースに基づいて計算されます。十分なスペースがない場合は、丸められた整数が使用されます。固定小数点形式の最小の長さは、整数、小数点、および 1 桁の 10 進数です (常に少なくとも 1 桁あります。末尾の小数点だけには書式設定されません)。

MinLength=4MaxLength=4およびValue=954の出力は です"0954"Value=54、 の場合はの"54.0"ための十分なスペースがあるため.0です。これは、実際に存在するかどうかはわかりませんが、小数点記号が複数の文字である文化もサポートします。

いくつかの例:

Value=987.654MinLength=4MaxLength=4:"0988"

Value=987.654MinLength=3MaxLength=4:"988"

Value=987.654MinLength=4MaxLength=5:"987.7"

Value=987.654MinLength=4MaxLength=10:"987.654000"

于 2013-06-26T14:33:38.770 に答える
1

String.PadLeft メソッドを使用できます。

string x= Value.ToString(culture);
x.PadLeft(MaxLength -x.Length,'0');
于 2013-06-26T11:27:30.947 に答える
0

ひょっとして、こういうこと?

       int min_Length = 4;
       int max_Length = 10;
       dobule Value = 56665.66;
        String  temp = Value.ToString(culture); // this is the easy but incorrect way
        if (temp.Length < min_Length)
        {
            while (temp.Length < min_Length)
            {
                temp = "0" + temp;
            }
        }

      else if (temp.Length > max_Length)
            {
                temp = temp.Substring(0, max_Length);
            }
            return temp;
于 2013-06-26T11:26:05.443 に答える