Dobles, comas y puntos
Estoy haciendo un programa Android Java que está tomando valores dobles del usuario. Si ejecuto el programa en el ordenador funciona muy bien debido a la configuración regional de mi ordenador, EN_UK. Pero cuando lo ejecuto en mi teléfono móvil con FI_FI locale, no funcionará. Sé la razón: En el Reino Unido la gente usa punto como seperator decimal pero aquí en Finlandia el separador decimal es coma.
DecimanFormat df = new DecimalFormat("#.#"); Double returnValue = Double.valueOf(df.format(doublenumber));
Cuando estoy usando coma, dice java.lang.NumberFormatException: Invalid double: "1234,5"
.
- Error de libcurl CURLE_SSL_CACERT_BADFILE en android
- El contexto de Android se convierte en nulo
- Determine el ancho de banda de conexión de red (velocidad) wifi y datos móviles
- Cómo ejecutar la aplicación Java en Android
- Campos estáticos en Android
¿Cómo puedo hacer que funcione con ambos, coma y punto?
- Android Studio dice usar Gradle 1.10 - pero la nueva versión es 1.12?
- "Error: no se puede encontrar la variable de símbolo xml" al intentar google analytics
- Android OpenGL ES 2.0: El modelo de cubo no sólo está distorsionado (la perspectiva es incorrecta?), Sino también las caras se cargan incorrectamente (los vértices no son correctos?)
- Diferencia de regex de Java y Android
- SDK de Android no se instala en win 7 de 64 bits
- ¿Cómo puedo implementar un AsyncTaskLoader simple?
- Error en la instalación de Multidex
- Cómo enviar una matriz String como nombre de valor básico par como HTTPPOST?
Utilice uno de los otros constructores de DecimalFormat:
new DecimalFormat("#.#", new DecimalFormatSymbols(Locale.US))
Y luego intentarlo y analizarlo utilizando ambos separadores.
DecimalFormatSymbols.getInstance()
producirá los símbolos correctos de la configuración regional predeterminada, por lo que lo obtendrá correctamente para cualquier plataforma en la que se ejecute.
DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance());
Esto debería funcionar tanto para Java (probado) como para android 🙂
-
Nombre de la clase: In18Helper.java
package com.akmeher.app.utils; import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; public class In18Helper { private final static In18Helper mHelper = new In18Helper(); public static final In18Helper getInstance() { return mHelper; } public double getDouble(String sValue, Locale locale) { NumberFormat numberFormat = NumberFormat.getInstance(locale); Number parse = null; try { parse = numberFormat.parse(sValue); } catch (ParseException e) { e.printStackTrace(); } return parse == null ? 0 : parse.doubleValue(); } }
-
Nombre de la clase: Application.java
package com.akmeher.app; import java.util.Locale; import com.akmeher.app.utils.In18Helper; public class Application { static DataModel[] testData = new DataModel[] { new DataModel("1.034567", Locale.ENGLISH), new DataModel("1,0345.67", Locale.ENGLISH), new DataModel("1.0345,67", Locale.GERMANY), new DataModel("1,034,567", Locale.CANADA), new DataModel("1.034567", Locale.KOREA), new DataModel("1,03.4567", Locale.ITALY) }; /** * @param args */ public static void main(String[] args) { for (int i = 0; i < testData.length; i++) { double d = In18Helper.getInstance().getDouble(testData[i].mValue, testData[i].mLocale); System.out.println("Trial Value: "+testData[i].mValue+" for Locale: "+testData[i].mLocale+" converted to: "+d); } } private static class DataModel { String mValue; Locale mLocale; public DataModel(String value, Locale locale) { this.mLocale = locale; this.mValue = value; } } }
Salida:
Trial Value: 1.034567 for Locale: en converted to: 1.034567 Trial Value: 1,0345.67 for Locale: en converted to: 10345.67 Trial Value: 1.0345,67 for Locale: de_DE converted to: 10345.67 Trial Value: 1,034,567 for Locale: en_CA converted to: 1034567.0 Trial Value: 1.034567 for Locale: ko_KR converted to: 1.034567 Trial Value: 1,03.4567 for Locale: it_IT converted to: 1.03
Espero que esto ayude a alguien a hacer uso de.
public static Double parseDoubleTL(String value){ DecimalFormat df = new DecimalFormat("#.#", new DecimalFormatSymbols(new Locale("tr_TR"))); Double doublePrice = 0.0; try { doublePrice = df.parse(value).doubleValue(); } catch (ParseException e) { Log.w(MainActivity.TAG,"Couldnt parse TL. Error is "+e.toString()); } return doublePrice; }
No es una mejor manera, pero trabajó para mí;
Double val=null; try{ val=Double.valueOf(value); }catch(Exception e){ val=Double.valueOf(value.replace(',','.')); } Double val=null; try{ val=Double.valueOf(value); }catch(Exception e){ val=Double.valueOf(value.replace(',','.')); } return val;
Me Error:
java.lang.NumberFormatException: Invalid float: "1,683.88"
… y este trabajo para mí
replace(",", "")
DecimanFormat df = new DecimalFormat("#.#");
- Devolver la cadena del fragmento de diálogo a Actividad
- ¿Cómo integrar paytm wallet en la aplicación android?