Quiero convertir algunos números que obtuve como cadenas en Dobles, pero estos números no están en la configuración estándar de EE. UU., Sino en una diferente. ¿Cómo puedo hacer eso?¿Cómo convierto un String a Double en Java utilizando una configuración regional específica?
Respuesta
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!
Agregue el método .doubleValue() a la respuesta y lo aceptaré. –
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
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
Esto no debería ser un problema con java.text.DecimalFormat.
Usted usa un NumberFormat
. Here es un ejemplo, que creo que parece correcto.
Uso NumberFormat.getNumberInstance (Locale)
¿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.
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 ". –
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
NumberFormat es el camino a seguir, pero debe tener en cuenta sus peculiaridades que surgen cuando los datos son menos del 100% correctos.
He encontrado muy útil el siguiente:
http://www.ibm.com/developerworks/java/library/j-numberformat/index.html
Si la entrada se puede confiar, entonces no tiene que preocuparse por ello.
Aquí es cómo se utiliza para convertir un parseDouble
String
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);
}
}
¿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
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). –
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;)
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. –
- 1. ¿Cómo convierto Double [] a double []?
- 2. ¿Cómo validar una configuración regional en Java?
- 3. Obtener la cadena de la configuración regional predeterminada mediante una cadena en la configuración regional específica
- 4. Cómo formateo una moneda para una configuración regional en Java
- 5. Qué configuración regional debo especificar cuando llamo a String toLowerCase
- 6. ¿Cómo convierto un Array [String] a un Set [String]?
- 7. ¿Cómo convierto un String en un InputStreamReader en java?
- 8. Cómo convertir un string a double con un cultureinfo adecuado
- 9. ¿Falta la configuración regional en Java?
- 10. ¿Cómo convierto una colección de Groovy String a una Java String Array?
- 11. Conversión de String a Double en Android
- 12. ¿Cómo convierto un InputStream a una cadena en Java?
- 13. Configuración de la configuración regional de Java
- 14. La configuración regional no existe en Java
- 15. Inicie la aplicación con la configuración regional específica
- 16. ¿Cómo convierto wchar_t * a std :: string? .?
- 17. Cómo depurar aplicaciones de Xcode en una configuración regional específica (en inglés, por ejemplo)?
- 18. Hash a double en Java
- 19. ¿Cómo convierto un std :: string a un boost :: gregorian :: date?
- 20. Formato de fecha Java para configuración regional
- 21. ¿Cómo convierto un System :: String^a const char *?
- 22. ordenamiento dependiente de la configuración regional para std :: string
- 23. Configuración regional en Android
- 24. ¿Cómo convierto un diccionario a una búsqueda?
- 25. Agregar una configuración regional en Mac OSX
- 26. ¿Cómo convierto un objeto String en un objeto Hash?
- 27. ¿Cómo convierto una matriz de bytes a Base64 en Java?
- 28. Java junit test change Configuración regional en Spring SimpleFormController
- 29. cómo obtener información de configuración regional en una aplicación GWT
- 30. ¿Cómo convierto un byte a un largo en Java?
tengo seis respuestas, sólo dos de ellos upvoted, pero todos ellos son correctos. Los laureles van a la respuesta completa. –