2009-05-20 11 views

Respuesta

59

Probar java.text.NumberFormat. Desde Javadocs:

Para formatear un número para una configuración regional diferente, especifíquelo en la llamada a getInstance.

NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH); 

También puede utilizar un NumberFormat para analizar los números:

myNumber = nf.parse(myString); 

parse() devuelve un Number; así que para obtener un double, debe llamar myNumber.doubleValue():

double myNumber = nf.parse(myString).doubleValue(); 

Tenga en cuenta que nunca se volverá parse()null, así que esto no puede causar una NullPointerException. En cambio, parse arroja un ParseException marcado si falla.

Editar: originalmente me dijeron que no había otra manera de convertir a double: enviar el resultado al Double y utilizar unboxing. Pensé que, dado que se estaba utilizando una instancia de propósito general de NumberFormat (según Javadocs para getInstance), siempre devolvería un Double. Pero DJClayworth señala que Javadocs para parse(String, ParsePosition) (que se llama por parse(String)) dice que se devuelve un Long si es posible. Por lo tanto, lanzando el resultado a Double no es seguro y no debe intentarse.
Gracias, DJClayworth!

+0

Agregue el método .doubleValue() a la respuesta y lo aceptaré. –

+0

No veo nada que prometa que NumberFormat.parse() devuelve un doble. De hecho, parece decir que si el valor puede contenerse en Long, devuelve Long, haciendo que tu método 1 lance una ClassCastExeption. – DJClayworth

+8

Tenga cuidado con el francés, porque el entorno local FR_fr usa un espacio sin interrupción (U + 00A0) como separador de agrupación. Esto hace que el texto parezca igual que si el separador fuera un espacio "normal" (U + 0020) (por ejemplo, espacio de teclado estándar). El resultado es un error silencioso en el que una cadena numérica que parece tener un formato correcto como "3 141,59" se analiza en 3 en lugar de 3141.59. La cadena se debe especificar como "3 \ u00A0141,59" para que se pueda analizar correctamente. Además, es una buena práctica utilizar el método con ParsePosition y comprobar ParsePosition.getIndex() == inputString.length() después del análisis. – Phil

1

Esto no debería ser un problema con java.text.DecimalFormat.

1

Uso NumberFormat.getNumberInstance (Locale)

0

¿Sabe usted qué configuración regional que es? Entonces puede usar

DecimalFormat format = DecimalFormat.getInstance(theLocale); 
format.parse(yourString); 

esto incluso funcionará para anotaciones científicas, cadenas con signos de porcentaje o cadenas con símbolos de moneda.

+1

No se garantiza que DecimalFormat.getInstance devuelva un DecimalFormat, en realidad. Realmente está llamando a NumberFormat.getInstance, que solo garantiza devolver una subclase de NumberFormat. Desde los documentos de NumberFormat: "Si desea un mayor control sobre el formato o el análisis sintáctico, o si desea darles a sus usuarios más control, puede intentar convertir el NumberFormat que obtiene de los métodos de fábrica en un DecimalFormat. Esto funcionará para la gran mayoría de locales, solo recuerda ponerlo en un bloque de prueba en caso de que encuentres uno inusual ". –

+0

Tienes razón de hecho. En mi código, realmente uso DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance (theLocale); No sabía que no funciona para todas las configuraciones regionales ... – Fortega

-3

Aquí es cómo se utiliza para convertir un parseDoubleString a un Double:

doubleExample.java

import java.io.BufferedReader; 

import java.io.IOException; 

import java.io.InputStreamReader; 

public class doubleExample { 

     public static void main(String[] args) { 

       Double myDouble = new Double("0"); 
       System.out.println("Please enter a number:"); 

       try 
       { 
         //get the number from console 
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
         myDouble = Double.parseDouble(br.readLine()); 
       } 
       //if invalid value was entered 
       catch(NumberFormatException ne) 
       { 
         System.out.println("Invalid value" + ne); 
         System.exit(0); 
       } 
    catch(IOException ioe) 
       { 
         System.out.println("IO Error :" + ioe); 
         System.exit(0); 
       } 

       System.out.println("Double value is " + myDouble); 
     } 
} 
+0

¿Qué aporta tu respuesta a las respuestas previamente aceptadas y las respuestas con mayor número de votos? ¿Te importa comentar tu código un poco? – Yaroslav

+3

Esta respuesta es * DOWNRIGHT INCORRECT *.De acuerdo con la documentación de la API de Java, 'parseDouble' utiliza las mismas reglas que' valueOf', que son de doble formato Java * Language *. Eso significa que no analizará '1,0' como el doble, sin importar la configuración regional actual. Y, además, no hay forma de pasar una configuración regional * específica *, como se solicitó (lo cual tiene sentido, ya que no usa la configuración regional en absoluto). –

3

Sólo el aprendizaje de Java y programación. Tenía una pregunta similar. Encontrado algo como esto en mi libro de texto:

Scanner sc = new Scanner(string); 
double number = sc.nextDouble(); 

El libro dice que un escáner decodifica automáticamente lo que está en un variabel cadena y que la clase escáner se adapta automáticamente al idioma del conjunto de configuración regional, la configuración regional del sistema es el defecto, pero eso es fácil de configurar para otra cosa.

He resuelto mi problema de esta manera. Tal vez esto podría funcionar para el problema anterior en lugar de analizar?

Adición: El motivo por el que me gustó este método fue el hecho de que cuando uso cajas de marcación para entrada y luego trato de convertir la cadena a doble con análisis obtengo una NumberFormatException. Resultó que el análisis utiliza exclusivamente el formato de número de EE. UU. Mientras que el escáner puede manejar todos los formatos. El escáner hizo que la entrada funcionara perfectamente incluso con el separador decimal de coma (,). Como la respuesta más votada utiliza el análisis, realmente no veo cómo resolvería este problema en particular. Tendría que ingresar sus números en el formato de EE. UU. Y luego convertirlos a su formato de configuración regional. Eso es bastante inconveniente cuando el teclado numérico está equipado con una coma.

Ahora ya está todo libre al triturar en pedazos;)

+1

Los comentarios (en Android Studio al menos) para java.util.Scanner son algo graciosos ... 'Un analizador que analiza una cadena de texto de tipos primitivos y cadenas con la ayuda de expresiones regulares. Esta clase no es tan útil como podría parecer. Es muy ineficiente para comunicarse entre máquinas; debe usar JSON, protobufs o incluso XML para eso. Los usos muy simples pueden salirse con String # split. Para la entrada de humanos, el uso de expresiones regulares específicas de la localidad hace que no solo sea costoso sino también algo impredecible. –

Cuestiones relacionadas