Значения неверны при использовании String.Format - PullRequest
0 голосов
/ 29 сентября 2011

Мне нужно преобразовать десятичное значение во что-то вроде

0.3 = USDC000000000030

Код, который я написал, приведен ниже.

   transactionAmount = String.Format("USDC{0}", ((int)(amount*100)).ToString("D12"));

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

0,9 = USDC000000000089

1 = USDC000000000099

1,1 USDC000000000109

Любойидея почему так происходит?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

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

Используйте decimal вместо этого, и смойте свои проблемы.

Для остроумия:

decimal amount = 0.3m;
string s = String.Format("USDC{0:000000000000}", 100 * amount);
Console.WriteLine(s);

Выход:

USDC000000000030

Обратите внимание, что в спецификации языка указано:

Десятичный тип - это 128-битный тип данных, подходящий для финансовых и денежных расчетов.

0 голосов
/ 29 сентября 2011

Попробуйте вместо этого:

String.Format("USDC{0:D12}", (int)(Convert.ToDecimal(amount) * 100));

Проверено со следующим:

  • 0,90 = USDC000000000090
  • 1,00 = USDC000000000100
  • 0,89 =USDC000000000089
  • 0,84 = USDC000000000084
  • 1,10 = USDC000000000110
...