Пользовательский Числовой Формат Ошибка Отрицательного раздела

Не уверен, что это 100% ошибка, но поведение действительно странное. Моя задача - правильно отформатировать дробь. Например, если:

 int numerator = -7;
 int denominator = 100;

Затем, если применяется следующая строка кода:

string fraction = numerator.ToString("#/"+ denominator +";-#/" + denominator +";0");

что соответствует логике разделителя разделов Microsoft: https://msdn.microsoft.com/en-us/library/0c899ak8%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

должен выдавать "7/100", если числитель положительный (7), "-7/100", если числитель отрицательный (-7), и "0", если числитель 0. Поскольку строка формата выглядит следующим образом "#/100;-#/100;0"

Но по какой-то причине это не работает должным образом для негативного сценария. Если числитель положительный, все ведут себя как ожидалось, но если он по какой-то причине отрицательный, он заменит последнюю цифру в производимой строке. Таким образом, я получаю вывод примерно так: "- /107". Какие-нибудь мысли?

2 ответа

Решение

Ваша строка формата "#/100;-#/100;0". Это очень странная строка формата. Вы говорите:

  • Если число положительное, используйте формат "#/100".
  • Если число отрицательное, используйте формат "-#/100".
  • Если число равно нулю, используйте формат "0".

Для обоих первых двух случаев у вас есть заполнители из трех цифр, первый из которых является необязательным (поэтому будет отображаться только при наличии 3 или более цифр для печати), а два последних из них требуются (поэтому они будут покажи 0 в противном случае). Символы "/" и "1" не имеют специального значения, поэтому они будут отображаться как есть.

Итак, мы имеем:

   1 => /101
  12 => /112
 123 => 1/123
  -1 => -/101
 -12 => -/112
-123 => -1/123

Все это работает так, как задокументировано - только не так, как вы хотели, чтобы это работало. Похоже, вы, возможно, хотели указать 100, чтобы 0 не были заполнителями. Строка формата "#/'100';-#/'100';0" выдает:

   1 => 1/100
  12 => 12/100
 123 => 123/100
  -1 => -1/100
 -12 => -12/100
-123 => -123/100

... но я бы посоветовал сделать это без использования строки формата:

string text = numerator == 0 ? "0" : numerator + "/" + denominator;

0 является действительным заполнителем так же, как #, кажется, что используется просто первый заполнитель справа (который является 0 в 100).
Вы можете жестко закодировать эту часть с ' как

string fraction =  numerator.ToString("#/'"+ denominator +"';-#/'" + denominator +"';0");

который дает -7/100

Другие вопросы по тегам