Problemas de localización

Buenas gente,

estoy teniendo un problemita de localización. Me di cuenta de que una aplicación que me muestra el precio del bitcoin, en mi computadora con Catalina 10.15.4 me empezó a mostrar los precios con una localización errónea.

$6373,75 en vez de $6.373,75.

Como el código es mío, me puse a ver qué había hecho mal. Pero al mismo tiempo, veo que en mi vieja compu corriendo El Capitán, el mismo binario lo muestra bien (estoy seguro de que en Catalina, hasta hace poco lo mostraba bien).

Haciendo pruebas veo que 1234 lo formatea mal, pero 12.345 lo localiza bien. Es decir, los menores a 10.000 los formatea mal.

Numbers.app, que fue la única app que probé tiene el mismo problema formateando números.

Alguien tuvo alguna vez problemas con esto? Les dejo un código para que prueben en Playground, estoy forzando el locale en en_AR (también pasa con es_AR) porque con otros locale el error no ocurre.

Alguna idea? Qué resultados obtienen con macOs anteriores a 10.15.4?

Gracias!!

EDIT: iOS 13.4 tiene el mismo problema. De hecho, en Settings, General, Language & Region, si tenés Argentna como Region, ya el ejemplo de formatos muestra mal $ 1234,56 y 4567,89.

import Foundation

let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_AR")

formatter.numberStyle = .decimal

formatter.string(from: NSNumber(value: 1234))
// 1234

formatter.string(from: NSNumber(value: 12345))
// 12.345
1 me gusta

Me puse a probar con otros locales y estoy seguro que te cruzaste con un bug (también tengo Catalina, 10.15.13).

import Cocoa
import Foundation

let locales = ["en_US", "es_AR", "es_CL", "fr_FR"]

for l in locales {
    let formatter = NumberFormatter()
    formatter.locale = Locale(identifier: l)
    formatter.numberStyle = .decimal

    print("Locale: \(l)")
    print(formatter.string(from: NSNumber(value: 1234.56))!)
    print(formatter.string(from: NSNumber(value: 12345.67))!)
    print("-----")
}

Output:

Locale: en_US
1,234.56
12,345.67
-----
Locale: es_AR
1234,56
12.345,67
-----
Locale: es_CL
1234,56
12.345,67
-----
Locale: fr_FR
1 234,56
12 345,67
-----

Habría que buscar alguno que tenga “.” como thousand separator y que no falle. Acá hay una lista con todos los locales.

UPDATE: Tengo una laptop con Mojave. Mañana lo pruebo.

Que salame, no probé con otros…

Acá están todos los aparentemente erroneos:

import Foundation

for l in Locale.availableIdentifiers {
    let formatter = NumberFormatter()
    formatter.locale = Locale(identifier: l)
    formatter.numberStyle = .decimal
  
    let foo = formatter.string(from: NSNumber(value: 1234.56))
    let bar = formatter.string(from: NSNumber(value: 12345.67))

    guard foo?.prefix(4) == "1234" && bar?.prefix(3) == "12." else { continue }
  
    print("Locale: \(l)")
    print(foo!)
    print(bar!)
    print("-----")
}

Output:

Locale: es_EA
1234,56
12.345,67
-----
Locale: es_EC
1234,56
12.345,67
-----
Locale: ia_001
1234,56
12.345,67
-----
Locale: es_GQ
1234,56
12.345,67
-----
Locale: es_UY
1234,56
12.345,67
-----
Locale: en_AR
1234,56
12.345,67
-----
Locale: es_PH
1234,56
12.345,67
-----
Locale: es_ES
1234,56
12.345,67
-----
Locale: es_CL
1234,56
12.345,67
-----
Locale: es_CO
1234,56
12.345,67
-----
Locale: es_CR
1234,56
12.345,67
-----
Locale: es_BO
1234,56
12.345,67
-----
Locale: es_PY
1234,56
12.345,67
-----
Locale: es_AR
1234,56
12.345,67
-----
Locale: es_IC
1234,56
12.345,67
-----
Locale: es_VE
1234,56
12.345,67
-----
Locale: ia
1234,56
12.345,67
-----
Locale: es
1234,56
12.345,67
-----

Mucho es… Abrí un issue, no estoy seguro de haberlo hecho en el lugar correcto…

1 me gusta