es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Java/Kotlin convierte números en una representación de cadena mejorada (notación “aa”)

Actualmente estoy programando un sistema de puntos para jugadores en mi aplicación. Dado que estos puntos pueden aumentar rápidamente hasta volverse muy grandes, me gustaría tener un sistema que convierta un BigInteger en una representación mejor (ver abajo).

Ejemplos:

1000 -> 1k
5555555 -> 5.55m
1000000000000000000 -> 1ab

Unidades: k, m, b, t, aa, ab, ac …

Realmente no tengo nada aún, ya que no sé por dónde empezar.
Encontré este, pero está en C# y realmente no sé cómo convertirlo a Java/Kotlin.

Quizás alguien pueda darme un punto de partida o simplemente un fragmento de código que lo haga. 😀

Disculpen por el mal inglés.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir un BigInteger a una representación mejor, puedes comenzar creando una función que tome un BigInteger como entrada y devuelva una cadena de texto con la unidad correspondiente (k, m, b, t, aa, ab, ac, etc.) basándose en lo grande que sea el BigInteger.

    Aquí tienes una implementación en Java basada en el código de C# del enlace que proporcionaste:

    public static String formatBigInt(BigInteger num) {
        int power = (num.toString().length() - 1) / 3 * 3;
        double n = num.doubleValue() / Math.pow(10, power);
        String unit = "";
        if (power >= 3 && power < 33) { // hasta 999 decillones
            unit = String.valueOf((char)('a' + (power-3)/3));
        }
        return String.format("%.2f%s", n, unit);
    }
    

    Para usar esta función, simplemente llama a formatBigInt(miBigInteger) y devolverá una cadena de texto formateada con la unidad correspondiente. Por ejemplo:

    BigInteger num1 = BigInteger.valueOf(1000);
    BigInteger num2 = BigInteger.valueOf(5555555);
    BigInteger num3 = new BigInteger("1000000000000000000");
    
    System.out.println(formatBigInt(num1)); // salida: 1.00k
    System.out.println(formatBigInt(num2)); // salida: 5.56m
    System.out.println(formatBigInt(num3)); // salida: 1.00ab
    

    Ten en cuenta que esta implementación admite hasta 999 decillones (es decir, 10^999), que es el número más grande que se puede representar con un BigInteger.

Comments are closed.