none
Redondear valores c# RRS feed

  • Pregunta

  • Estoy intentando redondear los valores obtenidos desde mi web service pero no encuentro como formarlo. Alguien puede ayudarme.
    El valor no es correcto. No tiene en cuenta la "coma" de los valores. Por ejemplo: Valor sin redondear que cojo es 99,524534 %y con lo que he realizado me redondea a 9.524%. No toma en cuenta la "coma", debería ser 99%.
    ¿Debería quitar la coma o cambiarla por un punto?. Como sería la forma de hacerlo ya que tengo realizada una conexión de web service.

    else if (SistemaID == 223){
     
        string url = "https://normonapi.normon.com/EBR/AC2-18COMPLETADO";
        var json = new WebClient().DownloadString(url);
        dynamic datos = JsonConvert.DeserializeObject(json);
     
        foreach(var i in datos){
          this.txtProgreso.Text = Conversor.convertirString((i.Value_Double.ToString("P0")));
        }


    geovanny

    jueves, 21 de mayo de 2020 9:05

Respuestas

  • Casi seguro que lo que pasa es que se te ha olvidado tener en cuenta la parte donde antes dijimos que el formato P multiplica por 100 antes de presentar el valor.

    Como ya se dijo en una respuesta anterior, el remedio es o bien dividir por 100 o bien usar otro formato distinto (por ejemplo, N en lugar de P).

    Observa que lo del "culture" no guarda ninguna relación con esto. EL efecto de usar un culture u otro es que te salga "7.193" o "7,193" (punto en lugar de coma o viceversa), pero no tiene nada que ver on el hecho de que el formato P multiplique por 100.

    • Marcado como respuesta GeovannyVarLo miércoles, 27 de mayo de 2020 9:07
    martes, 26 de mayo de 2020 16:31

Todas las respuestas

  • El valor devuelto por el webservice es un json. Dentro del json el estándar para codificar valores numéricos usa siempre un punto para los decimales (no una coma).

    Pero esto en tu caso es irrelevante, porque a continuación haces una llamada a DeserializeObject. Eso deserializa el json (usando el punto) y lo convierte a binario (que no tiene ni punto ni coma, simplemente tiene una serie de bits que representan la mantisa y el exponente del número).

    Después  tomas ese valor binario y haces una llamada a ToString. Esto te va a generar un string que contendrá una coma o un punto según la configuración regional del equipo (o el CurrentCulture si no coincide con la configuración regional).

    Pero nada de esto guarda relación con los redondeos. Tu error viene de que no has tenido en cuenta que el formato "P0" primero multiplica por 100 antes de redondear. Para que te salga 99% el valor tiene que ser 0,99... no 99,...

    Una de dos: divide por 100 antes de formatear, o utiliza algún otro formato distinto.

    • Propuesto como respuesta Sergio Parra jueves, 21 de mayo de 2020 16:19
    jueves, 21 de mayo de 2020 14:19
  • Hola, si gracias lo tengo en cuenta. 

    Una pregunta que yo en c# no tengo mucha experiencia. Para formar la estructura con la cultura. ¿Como puedo realizarla? tengo echo esto:

    culture = CultureInfo.CreateSpecificCulture("eu-ES");
                 var valor = Conversor.convertirString(i.Value_Double.ToString("P1"));
                 this.txtProgreso.Text = valor;

    Gracias


    geovanny

    martes, 26 de mayo de 2020 10:33
  • No, eso no funcionará. Primero creas un cultureInfo... pero luego no lo usas para nada. Una de dos, o bien asignas ese cultureinfo al currentculture del currentthread (y entonces vale para todas las conversiones que hagas en todo el programa), o de lo contrario tienes que pasárselo como argumento al ToString:

    i.Value_Double.ToString("P1", culture)

    Editado: Por cierto, ¿qué es el "eu" que has puesto en tu CreateSpecificCulture? ¿Euskera? No lo había visto nunca antes.

    martes, 26 de mayo de 2020 11:35
  • Lo de eu fue una errata perdón. Ya lo he realizado pero sigue dándome un resultado 7.193 % en vez de 7% 

    culture = CultureInfo.CreateSpecificCulture("es-ES");
                 var valor = Conversor.convertirString(i.Value_Double.ToString("P0",culture));


    geovanny

    martes, 26 de mayo de 2020 11:55
  • Casi seguro que lo que pasa es que se te ha olvidado tener en cuenta la parte donde antes dijimos que el formato P multiplica por 100 antes de presentar el valor.

    Como ya se dijo en una respuesta anterior, el remedio es o bien dividir por 100 o bien usar otro formato distinto (por ejemplo, N en lugar de P).

    Observa que lo del "culture" no guarda ninguna relación con esto. EL efecto de usar un culture u otro es que te salga "7.193" o "7,193" (punto en lugar de coma o viceversa), pero no tiene nada que ver on el hecho de que el formato P multiplique por 100.

    • Marcado como respuesta GeovannyVarLo miércoles, 27 de mayo de 2020 9:07
    martes, 26 de mayo de 2020 16:31
  • Gracias. Con eso a servido.

    geovanny

    miércoles, 27 de mayo de 2020 10:09