Angular2 показать два десятичных знака на входе
у меня есть приложение angular2, которое должно всегда показывать две десятичные дроби во входах после некоторых вычислений. Но хотя в компоненте я заставляю иметь два десятичных знака, на входе он показывает его с нулевым десятичным знаком, одним десятичным знаком или десятичными знаками, которые есть у числа, но мне нужно всегда показывать два.
в контроллере я заставляю иметь два десятичных знака таким образом
return +(this.getCost() * this.getQuantity()).toFixed(2);
но когда я показываю это, результат может иметь разные десятичные дроби размер
<input name="number" pattern="^[0-9]+(.[0-9]{1,2})?" step="0.01" formControlName="number" type="button" class="form-control" id="number" >
добавив, что I; m с помощью TypeScript и тип поля-это число (которое, я думаю, вызывает округление)
8 ответов
Я бы предложил вам использовать маску на поле ввода есть пакет текст-маска что я использовал раньше и работает!
Примечание: взгляните на вас тип ввода html, вы сказали, что это номер, но на самом деле в вашем вопросе тип-кнопка
использовать пакет:
-
установить пакеты
npm i angular2-text-mask text-mask-addons --save
-
импортировать его в приложение-модуль файл
import { TextMaskModule } from 'angular2-text-mask'; @NgModule({ imports: [ /* ... */ TextMaskModule ] /* ... */ }) export class AppModule { }
-
В вам компонентов.ТС
import createNumberMask from 'text-mask-addons/dist/createNumberMask'; @Component({ selector: 'app-my-component', templateUrl: './my-component.html', styleUrls: ['./my.component.scss'] }) export class MyComponent implements OnInit { public price = 0; private currencyMask = createNumberMask({ prefix: '', suffix: '', includeThousandsSeparator: true, thousandsSeparatorSymbol: ',', allowDecimal: true, decimalSymbol: '.', decimalLimit: 2, integerLimit: null, requireDecimal: false, allowNegative: false, allowLeadingZeroes: false }); }
-
в своем компоненте.HTML-код
<input type="text" [textMask]="{mask: currencyMask}" name="receivedName" id="received" class="form-control" maxlength="50" [(ngModel)]="price"/>
tl; dr; Вариант 1: верните строку, не преобразуйте в число. Вариант 2: Используйте числовую трубу.
toFixed
возвращает строку.
вы конвертируете результат toFixed
ряд
return +(this.getCost() * this.getQuantity()).toFixed(2);
↑
при конвертации "1.20"
к числу он "удалит" дополнительный 0
возвращение 1.2
.
чтобы показать результат с 2 десятичными знаками, вы можете вернуть результат в виде строки, поэтому 0
не отрезается или не использует труба.
можно использовать номер трубы
{{ 1.20 | number:'1.2-2' }}
: {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}
-
minIntegerDigits
- минимальное количество целых цифр для использования. По умолчанию 1. -
minFractionDigits
минимальное количество цифр после дроби. По умолчанию 0. -
maxFractionDigits
максимальное количество цифр после дроби. По умолчанию 3.
С трубой вы можете сохранить свой код, возвращающий номер, и он будет измените формат значения только при отображении его на экране.
в угловой 2 есть DecimalPipe это будет полезно для вашего требования.Пожалуйста, используйте его. Пример:
Use format '3.2-5' :
minIntegerDigits = 3
minFractionDigits = 2
maxFractionDigits = 5
num = 12.324324
{{num1 | number:'3.2-5'}}
012.63847
Я не знаю, правильно ли я понял проблему, но я понял, что вы каким-то образом хотите заставить вход содержать две цифры после десятичной. Вот попытка: Вам нужно преобразовать число в тип float и, как вы хотите, чтобы он был исправлен до двух десятичных точек, используйте метод toFixed.
Number.parseFloat(x).toFixed(2)
//Where x is the number which needs to be converted to a float type.
надеюсь, это поможет.
Если ваш вход находится внутри формы с именем: inputForm e.g
HTML-код
<form [formGroup]="inputForm">
<input name="number" (keyup)="fixNumber()" pattern="^[0-9]+(\.[0-9]{1,2})?" step="0.01" `enter code here`formControlName="number" type="button" class="form-control" id="number">
</form>
TS
public fixNumber(){
let value =this.inputForm.get('number').value;
let prefix:string = value.toString().split('.')[0];
let suffix:string = value.toString().split('.')[1];
if(suffix.length > 2){
let suffix_subed = suffix.substr(0,2);
let new_value = prefix+'.'+suffix_subed;
this.inputForm.get('number').setValue(new_value);
}
}
вы можете получить некоторые erros журнала, но я думаю, что это не большой мертвый для этого обходного пути
DecimalPipe
DecimalPipe-это API угловой трубы и принадлежит CommonModule. DecimalPipe используется для форматирования числа в виде десятичного числа в соответствии с правилами локали. Он использует ключевое слово number с оператором трубы. Найдите синтаксис.
number_expression | number[:digitInfo]
наконец, мы получаем десятичное число в виде текста. Найти описание. number_expression: угловое выражение, которое выдаст выходное число. number: ключевое слово трубы, которое используется с оператором трубы. digitInfo : Он определяет формат чисел.
Теперь мы поймем, как использовать digitInfo. Синтаксис для digitInfo следующий.
{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}
найти описание.
minIntegerDigits : Minimum number of integer digits. Default is 1.
minFractionDigits : Minimum number of fraction digits. Default is 0.
maxFractionDigits : Maximum number of fraction digits. Default is 3.
в конце я не нашел правильного ответа...
что я сделал, так это создал следующую функцию
fixDecimals(value : string){
value = "" + value;
value = value.trim();
value = parseFloat(value).toFixed(2);
return value;
}
и я изменил тип ввода на текст (вместо числа).
и я вызываю эту функцию в ngOnInit, поэтому я всегда показываю число с десятичными знаками пользователю. Единственное ожидание заключается в том, что если пользователь изменит значение и удалит десятичные дроби, число не будет завершено с соответствующим 00.
Я попытался с onChange, но приглашение переходит в конец ввода (что очень неудобно для пользователя)