En Europa, los decimales se separan con ',' y utilizamos '' opcional. 'para separar miles. Dejo que los valores de moneda con:Cómo analizar una cantidad de moneda (EE. UU. O UE) para flotar valor en Java
- EE.UU.-estilo 123,456.78 notación
- estilo europeo 123.456,78 notación
utilizo el siguiente expresión regular (de biblioteca RegexBuddy) para validar la entrada. Permití fracciones opcionales de dos dígitos y separadores de miles opcionales.
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{0,2})?|(?:,[0-9]{3})*(?:\.[0-9]{0,2})?|(?:\.[0-9]{3})*(?:,[0-9]{0,2})?)$
Me gustaría analizar una cadena de moneda a un flotador. Por ejemplo
123,456.78 deben almacenarse como 123.456,78
123.456,78 deben almacenarse como 123.456,78
123,45 deben ser almacenados como 123.45
1.234 debe ser almacenada como 1234 12,34 deben ser almacenados como 12,34
y etc ...
¿Hay una manera fácil de hacer esto en Java?
public float currencyToFloat(String currency) {
// transform and return as float
}
Uso BigDecimal en lugar de flotador
Gracias a todos por las grandes respuestas. He cambiado mi código para usar BigDecimal en lugar de float. Mantendré flotante la parte anterior de esta pregunta para evitar que la gente cometa los mismos errores que yo.
Solución
El código siguiente muestra una función que transforma de Estados Unidos y la moneda de la UE a una cadena aceptada por el constructor BigDecimal (String). Eso es decir una cuerda sin separador de mil y un punto para fracciones.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestUSAndEUCurrency {
public static void main(String[] args) throws Exception {
test("123,456.78","123456.78");
test("123.456,78","123456.78");
test("123.45","123.45");
test("1.234","1234");
test("12","12");
test("12.1","12.1");
test("1.13","1.13");
test("1.1","1.1");
test("1,2","1.2");
test("1","1");
}
public static void test(String value, String expected_output) throws Exception {
String output = currencyToBigDecimalFormat(value);
if(!output.equals(expected_output)) {
System.out.println("ERROR expected: " + expected_output + " output " + output);
}
}
public static String currencyToBigDecimalFormat(String currency) throws Exception {
if(!doesMatch(currency,"^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{0,2})?|(?:,[0-9]{3})*(?:\\.[0-9]{0,2})?|(?:\\.[0-9]{3})*(?:,[0-9]{0,2})?)$"))
throw new Exception("Currency in wrong format " + currency);
// Replace all dots with commas
currency = currency.replaceAll("\\.", ",");
// If fractions exist, the separator must be a .
if(currency.length()>=3) {
char[] chars = currency.toCharArray();
if(chars[chars.length-2] == ',') {
chars[chars.length-2] = '.';
} else if(chars[chars.length-3] == ',') {
chars[chars.length-3] = '.';
}
currency = new String(chars);
}
// Remove all commas
return currency.replaceAll(",", "");
}
public static boolean doesMatch(String s, String pattern) {
try {
Pattern patt = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher matcher = patt.matcher(s);
return matcher.matches();
} catch (RuntimeException e) {
return false;
}
}
}
¿A qué se convierte 1.23? Su conjunto de reglas es contradictorio. ¿Por qué no aprovechar las instalaciones de localización en el extremo del cliente de su aplicación? – spender
1.23 convierte a 1.23 –
OK, mi mal ... pero en realidad, tratando de descifrar esto sin saber que el lugar del que vino tiene un mal olor. – spender