No estoy seguro de que sea 100% de error, pero el comportamiento es realmente extraño. Mi tarea es la fracción de formato adecuada. Por ejemplo si:

 int numerator = -7;
 int denominator = 100;

Entonces, si se aplica la siguiente línea de código:

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

Que está de acuerdo con la lógica de separación de secciones de microsofts: https://msdn.microsoft.com/en-us/library/0c899ak8%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396#The

Debería producir "7/100" si el numerador es positivo (7), "-7/100" si el numerador es negativo (-7) y "0" si el numerador 0. Porque la cadena de formato se ve así "# / 100; - # / 100 ; 0 "

Pero por alguna razón no está funcionando correctamente para un escenario de caso negativo. Si el numerador positivo se comporta como se esperaba, pero si es negativo por alguna razón, sustituirá el último dígito en la cadena producida. Así que termino con una salida como esta: "- / 107". ¿Alguna idea?

0
Dzianis Nosko 17 ene. 2017 a las 00:32

2 respuestas

La mejor respuesta

Su cadena de formato es "# / 100; - # / 100; 0". Esa es una cadena de formato muy extraña. Estás diciendo:

  • Si el número es positivo, use un formato de "# / 100".
  • Si el número es negativo, use un formato de "- # / 100".
  • Si el número es cero, use un formato de "0".

Para los dos primeros casos, tiene marcadores de posición de 3 dígitos, el primero de los cuales es opcional (por lo que solo aparecerá si hay 3 o más dígitos para imprimir) y los dos últimos son obligatorios (por lo que mostrar 0 de lo contrario). Los caracteres "/" y "1" no tienen un significado especial, por lo que aparecerán tal como están.

Entonces tenemos:

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

Todo eso funciona según lo documentado, pero no de la forma en que quería que funcionara. Parece que tal vez quisiste citar los 100 para que los 0 no terminaran como marcadores de posición. Una cadena de formato de "# / '100'; - # / '100'; 0" produce una salida de:

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

... pero sugeriría producir eso sin usar una cadena de formato:

string text = numerator == 0 ? "0" : numerator + "/" + denominator;
4
Jon Skeet 16 ene. 2017 a las 21:41

0 es un marcador de posición válido al igual que #, parece que simplemente se usa el primer marcador de posición de la derecha (que es el 0 en 100).
Puede codificar esa parte con ' como

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

Que produce -7/100

1
KekuSemau 16 ene. 2017 a las 21:42