Estoy en una situación un poco complicada. Obtengo algunos valores de precio de un sqlite db y los almaceno en un estado de reacción.
la respuesta se parece a: [{"price":50},{"price":"49,95"}]
Necesito almacenar estos valores como TEXTO en lugar de INTEGER, porque tengo muchos lugares decimales diferentes. también usar float en sqlite no me dará valores exactos, vea el problema en este ejemplo: https://dba.stackexchange.com/questions/15729/storing-prices-in-sqlite-what-data-type-to-use
Entonces, para mi problema principal: ¿cómo puedo extraer y convertir los valores de la matriz json en números y resumirlos?
Si no desea utilizar una biblioteca, puede convertir todos los números en cadenas y escribir su propia función de suma para cadenas. Este algoritmo admite cadenas largas arbitrarias que contienen números y devuelve resultados exactos sin errores de redondeo.
function add(l, r, sep) { if (!sep) sep = '.'; const [ll, lr] = l.split(/[,.]/).map(el => el.split('').map(Number)); const [rl, rr] = r.split(/[,.]/).map(el => el.split('').map(Number)); let carry = 0; const result = [[], []]; for (let i = Math.max(lr?.length ?? 0, rr?.length ?? 0); i > 0; --i) { result[1][i - 1] = (lr?.[i - 1] ?? 0) + (rr?.[i - 1] ?? 0) + carry; carry = Math.floor(result[1][i - 1] / 10); result[1][i - 1] %= 10; } for (let il = ll.length, ir = rl.length, iResult = Math.max(ll.length, rl.length); iResult > 0; --il, --ir, --iResult) { result[0][iResult - 1] = (ll[il - 1] ?? 0) + (rl[ir - 1] ?? 0) + carry; carry = Math.floor(result[0][iResult - 1] / 10); result[0][iResult - 1] %= 10; } if (carry) result[0] = [carry, ...result[0]]; return result[0].join('') + sep + result[1].join(''); } function sum(arr, sep) { return arr.map(el => String(el.price)).reduce((acc, el) => add(acc, el, sep)); } console.log(sum([{ "price": "0.9" }, { "price": "1.2" }], ',')); console.log(sum([{ "price": "100000000" }, { "price": "0.0000002" }])); console.log(sum([{ "price": 123.123 }, { "price": "1234.5678" }, { "price": "9876,54321" }, { "price": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"}]));