gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] 02/03: DD51 look for currency symbol and split betwe


From: gnunet
Subject: [taler-wallet-core] 02/03: DD51 look for currency symbol and split between small and normal
Date: Mon, 27 Nov 2023 17:10:04 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository wallet-core.

commit 5cc00344e2ed7736887a718bf5ddb2b25d1dc357
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Mon Nov 27 13:06:58 2023 -0300

    DD51 look for currency symbol and split between small and normal
---
 packages/taler-util/src/amounts.ts | 65 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 63 insertions(+), 2 deletions(-)

diff --git a/packages/taler-util/src/amounts.ts 
b/packages/taler-util/src/amounts.ts
index 5c6444b00..76ba3a0c5 100644
--- a/packages/taler-util/src/amounts.ts
+++ b/packages/taler-util/src/amounts.ts
@@ -30,6 +30,7 @@ import {
   DecodingError,
   renderContext,
 } from "./codec.js";
+import { CurrencySpecification } from "./index.js";
 import { AmountString } from "./taler-types.js";
 
 /**
@@ -49,6 +50,11 @@ export const amountFractionalLength = 8;
  */
 export const amountMaxValue = 2 ** 52;
 
+/**
+ * Separator character between interger and fractional
+ */
+export const FRAC_SEPARATOR = "."
+
 /**
  * Non-negative financial amount.  Fractional values are expressed as multiples
  * of 1e-8.
@@ -373,7 +379,7 @@ export class Amounts {
     if (!res) {
       return undefined;
     }
-    const tail = res[3] || ".0";
+    const tail = res[3] || (FRAC_SEPARATOR + "0");
     if (tail.length > amountFractionalLength + 1) {
       return undefined;
     }
@@ -508,7 +514,7 @@ export class Amounts {
     let s = av.toString();
 
     if (af || minFractional) {
-      s = s + ".";
+      s = s + FRAC_SEPARATOR;
       let n = af;
       for (let i = 0; i < amountFractionalLength; i++) {
         if (!n && i >= minFractional) {
@@ -543,4 +549,59 @@ export class Amounts {
     }
     return amountFractionalLength - i + 1;
   }
+
+  
+  static stringifyValueWithSpec(value: AmountJson, spec: 
CurrencySpecification): { currency: string, normal: string, small?: string } {
+    const strValue = Amounts.stringifyValue(value)
+    const pos = strValue.indexOf(FRAC_SEPARATOR)
+    const originalPosition = pos < 0 ? strValue.length : pos;
+  
+    let currency = value.currency
+    const names = Object.keys(spec.alt_unit_names)
+    let FRAC_POS_NEW_POSITION = originalPosition
+    //find symbol
+    //FIXME: this should be based on a cache to speed up
+    if (names.length > 0) {
+      let unitIndex: string = "0" //default entry by DD51
+      names.forEach(index => {
+        const i = Number.parseInt(index, 10)
+        if (Number.isNaN(i)) return; //skip
+        if (originalPosition - i <= 0) return; //too big
+        if (originalPosition - i < FRAC_POS_NEW_POSITION) {
+          FRAC_POS_NEW_POSITION = originalPosition - i;
+          unitIndex = index
+        }
+      })
+      currency = spec.alt_unit_names[unitIndex]
+    }
+  
+    if (originalPosition === FRAC_POS_NEW_POSITION) {
+      const { normal, small } = splitNormalAndSmall(strValue, 
originalPosition, spec)
+      return { currency, normal, small }
+    }
+  
+    const intPart = strValue.substring(0, originalPosition)
+    const fracPArt = strValue.substring(originalPosition + 1)
+    //indexSize is always smaller than originalPosition
+    const newValue = intPart.substring(0, FRAC_POS_NEW_POSITION) + 
FRAC_SEPARATOR + intPart.substring(FRAC_POS_NEW_POSITION)  + fracPArt
+    const { normal, small } = splitNormalAndSmall(newValue, 
FRAC_POS_NEW_POSITION, spec)
+    return { currency, normal, small }
+  }
+  
+  
+}
+
+function splitNormalAndSmall(decimal: string, fracSeparatorIndex: number, 
spec: CurrencySpecification): { normal: string, small?: string } {
+  let normal: string;
+  let small: string | undefined;
+  if (decimal.length - fracSeparatorIndex - 1 > 
spec.num_fractional_normal_digits) {
+    const limit = fracSeparatorIndex + spec.num_fractional_normal_digits + 1
+    normal = decimal.substring(0, limit)
+    small = decimal.substring(limit)
+  } else {
+    normal = decimal
+    small = undefined
+  }
+  return { normal, small }
 }
+

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]