Capital 5080 yuanes Contabilidad
*?Propósito del plan:
*?Recibir un número de la línea de comando y convertirlo a una cantidad china en mayúscula.
*?¿Cómo qué? 123,45?->? Ciento veintitrés dólares y cuarenta y cinco dólares.
*?@Autor? Base de datos del genoma
*
* ¿Realmente deficiente? El algoritmo en el programa no está claramente comentado, pero parece que sí.
*? Un poco difícil y poco legible. Además, muchos programas todavía tienen muchos errores que pueden detectarse a voluntad.
*?Así que decidí reescribir este programa e intentar eliminar errores innecesarios. ¿Este proceso
*? No utilicé ningún algoritmo sofisticado, solo usé algunas clases en la biblioteca de clases de Java, como expresiones regulares.
*?
*/
¿Público? ¿clase? ¿Trans2RMB? {
/**
? *?La viabilidad del plan de prueba
? *?@param? ¿Un nombre de parámetro
? */
¿Público? ¿Electricidad estática? ¿Vacío? principal(Cadena[]?args)? {
System.out.println("\n -
Trans2RMB?t2r?=?new?trans 2 RMB();
Cadena? s? =?t2r . clean zero(t2r . split num(t2r . round string(t2r . getnum())));
//?Si la cadena convertida es una cadena vacía, la pantalla no mostrará
Si (!"".equal to (s)). {
System.out.println("Después de convertir al chino: "?+?s); p>
p>
}
sistema . println(" \ n-"); /p>
?*?Recibe un número de la línea de comando y llama al método ?checkNum()? para verificarlo y devolver el valor correspondiente.
¿Privado? {
String? =?null
System.out.println("Ingrese un número (con una precisión de dos decimales):");
//?Ingrese este número de punto flotante desde la línea de comando
java.util.Scanner? =?new?Java.util.scanner(system.in);
s.
//?Cerrar el escáner
scanner .
//?Determinar si la entrada del usuario es legal. p> ///?Si es legal, devuelve este valor; si es ilegal, devuelve "0"
if(this.checkNum(s))?
}? ¿Y si? {
¿Devolver?";
}
}
/**
? *? Para determinar si los datos ingresados por el usuario son válidos, el usuario solo puede ingresar números mayores que cero
?
?*?@¿Devolver? ¿verdadero si la entrada del usuario es válida?
¿Privado s)? {
//?Si hay caracteres no numéricos en el número ingresado por el usuario, será considerado como datos ilegales y se devolverá?
¿Probar? {
¿Flotando? ¿F? =?float . valor de(s);
//?Si este número es menor que cero, se considera dato ilegal. ¿devolver? Incorrecto
Si (f?<?0)?{
System.out.println("Datos ilegales, ¡compruébelo!");
¿devolver? Falso;
}¿Algo más? {
¿Volver? ¿Real;
}
}?¿Atrapar? (NumberFormatException? e)? {
System.out.println("¡Datos ilegales, verifíquelos!");
¿Regresión? Falso;
}
}
/**
? *?Dividir el número ingresado por el usuario por el punto decimal, ¿llamar? formatonumero()? ¿Método
? *? Convierta la cantidad china correspondiente en forma de capital.
? *?Nota: ¿Se debe pasar el número ingresado? cadena redonda()? El método ha sido redondeado.
? *?@param? ¿s? ¿Línea
? *?@¿devolver? Cadena china convertida en mayúsculas.
? */
¿Privado? ¿Cadena? splitNum(cadena?s)? {
//?Si se pasa una cadena vacía, se seguirá devolviendo la cadena vacía.
Si("".Equal(s)). {
¿Volver? "";
}
//? Divide esta cadena por el punto decimal.
int? ¿índice? =?s.indexOf(" . ");
//?Intercepta y convierte la parte entera del número.
¿Cadena? ¿Solo int? =?s.substring(0, índice);
¿Cadena? parte1? =?this.numFormat(1, into only);
//?Intercepta y convierte la parte decimal de este número.
¿Cadena? ¿Solo pequeño? =?s.substring(index?+?1);
Cadena? ¿Segunda parte? =?this.numFormat(2, solo pequeño);
//?Coloque la parte entera y la parte decimal convertidas nuevamente en una nueva cadena.
¿Cadena? ¿noticias? =?parte1? +?Parte 2;
¿Regresar? Noticias;
}
/**
? *? Redondea el número pasado.
? *?@param? ¿s? ¿Cadena? Número ingresado desde la línea de comando.
? *?@¿devolver? ¿Nuevo valor después del redondeo
? */
¿Privado? ¿Cadena? cadena redonda (cadena? s)? {
//?Si se pasa una cadena vacía, se seguirá devolviendo la cadena vacía.
Si("".Equal(s)). {
¿Volver? "";
}
//?¿Convertir este número a? ¿Doble? Escribe y redondea.
¿Doble? ¿d? =?double . parse double(s);
//?Esta operación opera con dos decimales.
d? =?(d?*?100?+?0.5)?/?100;
//?Will. ¿d? ¿Formatos? =?¿Nuevo? Formato decimal de Java ("# # 0,000"). Formato (d);
//? Divide esta cadena por el punto decimal.
int? ¿índice? =?s.indexOf(" . ");
//?La parte entera de este número.
¿Cadena? ¿Solo int? =?s.substring(0, exponent);
//?La longitud máxima del valor especificado solo puede alcanzar billones de unidades; de lo contrario, ¿regresar? "0"
if(into only . length()?& gt?13)?{
System.out.println("¡Los datos de entrada son demasiado grandes! (El número entero la parte es de hasta 13 bits)");
¿Volver? "";
}
//?La parte decimal de este número.
¿Cadena? ¿Solo pequeño? =?s.substring(index?+?1);
//?Si la parte decimal es mayor que dos dígitos, solo se truncan los dos dígitos después del punto decimal.
if(smallOnly.length()?& gt?2)?{
¿Cadena? ¿Pequeña forma redonda? =?smallOnly.substring(0, 2);
//?Vuelva a juntar la parte entera y la parte decimal recién truncada para formar esta cadena.
s? =?intOnly? +?"."? +? Pequeña forma redonda;
}
¿Volver? s;
}
/**
? *?Convierta el número de la persona que llama a una cantidad china en mayúsculas.
? *?@param? ¿bandera? int? Bit de bandera, 1? Indica la parte entera de la conversión, ¿0? ¿Representa la parte decimal de la conversión
? *?@param? ¿s? ¿Cadena? ¿Cadena a convertir
? *?@¿devolver? Importe en RMB en mayúsculas con unidad.
? */
¿Privado? ¿Cadena? numFormat(int?bandera,?cadena?s)? {
int? ¿longitud? =?s.longitud().
//?Forma de moneda en mayúsculas
¿Cadena? letra grande[]? =?{"cero"? ¿"Uno" "eh"? "tres"? "jefe"? ¿"Wu"? ¿"Lu"? "gas"? "ocho"? "Nueve"};
//?Unidad monetaria
¿Cadena? unidad[]? =?{"元"? ¿"Recogerlo"? "Centenar"? "mil"? "Diez mil"?
//?De cien mil a diez millones
¿"Recogerlo"? "Centenar"? "Dinero",
//? Miles de millones a billones
¿"Miles de millones"? ¿"Recogerlo"? "Centenar"? "mil"? "Diez mil"};
¿Cadena? Pequeño[]? =?{"fen",? "Angle" };
//?Se utiliza para almacenar la nueva cadena convertida.
¿Cadena? ¿noticias? =?"";
//?Sustitución posición por posición de las formas de capital de China
for(int?i?=?0;?i?<?length;? i? ++)?{
If (flag?==?1)?{
//?Convertir la parte entera a mayúsculas chinas (con unidades)
¿Noticias? =?Noticias? +?letragrande[s.charAt(i)? -?48]?+?unidad[s de longitud? -?¿I? -?1];
}?¿En caso contrario? if (flag?==?2)?{
//?Convertir parte decimal (con unidad)
¿Novedades? =?Noticias? +?bigLetter[s.charAt(i)? -?48]?+?pequeño [¿largo? -?¿I? -?1];
}
}
¿Volver? Noticias;
}
/**
? *?Mejorar la forma de capital china convertida y limpiar las palabras.
? *?Los ceros adicionales en la cadena hacen que esta cadena sea aún más impresionante.
? *?Nota: ¿Se debe pasar el número ingresado? númerodividido()? ¿Cómo afrontar esta palabra
? *?Las cadenas deben expresarse en letras mayúsculas chinas.
? *?@param? ¿s? ¿Cadena? La cadena convertida.
? *?@¿devolver? ¿Cuerdas mejoradas
? */
¿Privado? ¿Cadena? cleanZero(cadena?s)? {
//?Si se pasa una cadena vacía, se seguirá devolviendo la cadena vacía.
Si("".Equal(s)). {
¿Volver? "";
}
//?¿Qué pasa si el usuario empieza a escribir mucho? 0? Elimine el "cero" adicional delante de la cadena para que parezca más idiomática.
mientras(s.charAt(0)?==?zero')? {
//? estará en la cadena. "cero"? y se retira su unidad correspondiente.
s? =?s . substring(2);
//?¿Qué pasa si el usuario solo ingresa la primera vez? 0, ¿solo se devuelve uno? "Cero"
if(s.length()?==?0)?{
¿Regresar? "Zero";
}
}
//?Cuando hay varios "ceros" en una cadena, solo lea un "cero" e ignore los adicionales. unidades.
/*?Debido a que mi investigación sobre algoritmos es demasiado pobre, solo puedo usar cuatro expresiones regulares para realizar la conversión. ¿No te importa, gambas? */
¿Cadena? expresión regular1[]? =?{"cero mil",? ¿"Cero cien"? "selección cero"};
¿Cadena? expresión regular2[]? =?{"000 millones",? ¿"Cero millones"? "cero yuanes"};
¿Cadena? expresión regular3[]? =?{"mil millones",? "Diez mil"? "elemento"};
¿Cadena? expresión regular4[]? =?{"ángulo de cero grados",? "zero"};
//?¿Primera ronda de conversión? ¿"Cero mil"? Cadenas como "cero cien" y "cero elección" se reemplazan por "cero"
for(int?i?=?0;?i?<?3;?i?++ )?{
s? =?s.replaceAll(regex1[i],?"zero");
}
//?¿Considere la segunda ronda de conversión? "Cero mil millones", "Cero mil millones", "Cero yuanes", etc.
//?En algunos casos, las unidades de "100 millones", "10,000" y "yuanes" no se pueden guardar y es necesario guardarlas.
for(int?i?=?0;?i?<?3;?i?++)?{
//?Después de la primera ronda de conversión, tal vez Habrá muchos ceros apilados uno encima del otro.
//?Convierte muchos ceros repetidos en unos.
s? =?S.replaceAll ("cero cero ","cero");
s? =?S.replaceAll ("cero cero ","cero");
s? =?s.replaceAll(regex2[i],?regex 3[I]);
}
//?La tercera ronda de conversión omite "ángulo cero" y "ángulo cero". punto" "Cadena.
for(int?i?=?0;?i?<?2;?i?++)?{
s? =?s.replaceAll(regex4[i],?"");
}
//?Cuando todo lo que esté entre "diez mil" y "cien millones" es Cuando " Se utiliza "cero", se ignora la unidad de "cien millones" y sólo se conserva "cien millones".
s? =?S.replaceAll("mil millones","millones");
¿Devolver? s;
}
}