Convierta un número largo en una cadena abreviada en JavaScript, con un requisito especial de acortamiento

En JavaScript, ¿cómo se escribiría una función que convierte un determinado [editar:entero positivo] número (por debajo de 100 mil millones) en una abreviatura de 3 letras - donde 0-9 y az / AZ se cuentan como una letra, pero el punto (ya que es muy pequeño en muchas fuentes proporcionales) no lo haría, y sería ignorado en términos del limite de letras?

Esta pregunta está relacionada coneste útil hilo, pero no es lo mismo; por ejemplo, donde esa función se convertiría por ejemplo. "123456 -> 1.23k" ("123.5k" son 5 letras) Estoy buscando algo que hace "123456 -> 0.1m" ("0 [.] 1m" son 3 letras). Por ejemplo, esta sería la salida de la función esperada (original izquierdo, valor de retorno ideal derecho):

0                      "0"
12                    "12"
123                  "123"
1234                "1.2k"
12345                "12k"
123456              "0.1m"
1234567             "1.2m"
12345678             "12m"
123456789           "0.1b"
1234567899          "1.2b"
12345678999          "12b"

¡Gracias!

Actualización: gracias! Una respuesta está en y funciona según los requisitos cuando se realizan las siguientes modificaciones:

function abbreviateNumber(value) {
    var newValue = value;
    if (value >= 1000) {
        var suffixes = ["", "k", "m", "b","t"];
        var suffixNum = Math.floor( (""+value).length/3 );
        var shortValue = '';
        for (var precision = 2; precision >= 1; precision--) {
            shortValue = parseFloat( (suffixNum != 0 ? (value / Math.pow(1000,suffixNum) ) : value).toPrecision(precision));
            var dotLessShortValue = (shortValue + '').replace(/[^a-zA-Z 0-9]+/g,'');
            if (dotLessShortValue.length <= 2) { break; }
        }
        if (shortValue % 1 != 0)  shortNum = shortValue.toFixed(1);
        newValue = shortValue+suffixes[suffixNum];
    }
    return newValue;
}

Respuestas a la pregunta(11)

Su respuesta a la pregunta