使用 fr Locale 转换 Decimal

Casting Decimal with fr Locale

我扩展了 DecimalPipe 并将其用于 fr 语言环境。

import { DecimalPipe, registerLocaleData } from '@angular/common';
import { Pipe, PipeTransform } from '@angular/core';
import localeFr from '@angular/common/locales/fr';

@Pipe({
    name: 'myDecimalPipe'
})
export class MyDecimalPipe extends DecimalPipe implements PipeTransform
{
    transform(value: any, args?: any) : any {
        let result;

        registerLocaleData(localeFr);

        result = super.transform(value, args, 'fr');

        return result;
    }
}

最初,当模型绑定时,它会根据格式直观地显示十进制值。

例如23.00 显示为 23,00 但在编辑时和分配回来时它抛出错误

core.js:6185 ERROR Error: InvalidPipeArgument: '23,23 is not a number' for pipe 'DecimalPipe'

用法:

constructor(private decimalPipe: MyDecimalPipe){}

update()
{
    this.decimalPipe.transform(model.value) //model.value is 23,23
}

这可能是什么问题?

for e.g. 23.00 is displayed as 23,00. but on editing and when it assigns back it is throwing the error

换句话说,当您通过字符串插值使用 DecimalPipe 时:{{23.03 | myDecimalPipe}} 它有效并打印 23,03,为什么?因为 23.03 值是通过此 angular 方法的有效数字:

function strToNumber(value) {
    // Convert strings to numbers
    if (typeof value === 'string' && !isNaN(Number(value) - parseFloat(value))) {
        return Number(value);
    }
    if (typeof value !== 'number') {
        throw new Error(value + " is not a number");
    }
    return value;
}

当您以编程方式调用 transform 方法时,您必须使用有效数字。

console.log(this.decimalPipe.transform("32.23")); // Will print 32,23
console.log(this.decimalPipe.transform("32,23")); // Throws error

要解决此问题,您只需使用以下方法将字符串 "32,23" 转换为有效数字:

update()
{
    this.decimalPipe.transform(Number(model.value.replace(',', '.'));
}