Динамический числовой формат в .NET? - PullRequest
4 голосов
/ 15 сентября 2010

У меня проблема, и я не могу найти решение.У меня есть цифры (десятичные), как 85.12343 или 100 или 1.123324.Я хочу отформатировать это так, чтобы результат всегда составлял 13 символов, включая разделитель.

100 -> 100.000000000
1.123324 -> 1.12332400000

Я пытался с toString, но не смог.Как я мог это сделать?

Спасибо:)

Ответы [ 7 ]

8 голосов
/ 15 сентября 2010
int digits = 13;
decimal d = 100433.2414242241214M;
int positive = Decimal.Truncate(d).ToString().Length;
int decimals = digits - positive - 1; //-1 for the dot
if (decimals < 0)
    decimals = 0;
string dec = d.ToString("f" + decimals);

Он не удаляет цифры из всей детали, только дробь, когда это необходимо.

4 голосов
/ 15 сентября 2010

Я бы пошел с ответом Коби , если только не возможно, что у вас может быть больше , чем 13 цифр, в этом случае вам может потребоваться сделать что-то подобное 1005 * предупреждение : я даже не пытался сделать это эффективным; наверняка есть способы его оптимизации при необходимости):

public static string ToTrimmedString(this decimal value, int numDigits)
{
    // First figure out how many decimal places are to the left
    // of the decimal point.
    int digitsToLeft = 0;

    // This should be safe since you said all inputs will be <= 100M anyway.
    int temp = decimal.ToInt32(Math.Truncate(value));
    while (temp > 0)
    {
        ++digitsToLeft;
        temp /= 10;
    }

    // Then simply display however many decimal places remain "available,"
    // taking the value to the left of the decimal point and the decimal point
    // itself into account. (If negative numbers are a possibility, you'd want
    // to subtract another digit for negative values to allow for the '-' sign.)
    return value.ToString("#." + new string('0', numDigits - digitsToLeft - 1));
}

Пример ввода / вывода:

Input                     Output
---------------------------------------
100                       100.000000000
1.232487                  1.23248700000
1.3290435309439872321     1.32904353094
100.320148109932888473    100.320148110
0.000383849080819849081   .000383849081
0.0                       .000000000000
1 голос
/ 15 сентября 2010
string formatted = original.ToString("0.000000000000").Remove(13);
1 голос
/ 15 сентября 2010

Quick 'n' dirty:

return (value.ToString("0.#") + "0000000000000").Substring(0, 13);
1 голос
/ 15 сентября 2010

Помимо простого заполнения строки, вы можете сделать более сложную математику, чтобы определить количество цифр:

String FormatField(Int32 fieldWidth, Decimal value) {
  var integerPartDigits =
    value != Decimal.Zero ? (int) Math.Log10((Double) value) + 1 : 1;
  var fractionalPartDigits = Math.Max(0, fieldWidth - integerPartDigits - 1);
  return value.ToString("F" + fractionalPartDigits);
}

Обратите внимание, что если значение отрицательное или имеет целочисленную часть с цифрой, меньшей ширины поля, вы не получите желаемого результата. Однако вы можете изменить код для соответствия этим случаям, исходя из того, как именно вы хотите отформатировать и выровнять эти числа.

0 голосов
/ 22 сентября 2014
int noofdecimal=3;
double value=1567.9800
value.ToString("#." + new string('0', noofdecimal));

//Result=1567.980
0 голосов
/ 08 апреля 2011

А как же

string newString;
if (original.ToString().Length >= 13)
{
    newString = original.ToString().Substring(13);
}
else
{
    newString = original.ToString().PadRight(13, '0');
}
...