Files
Mf/Mf.Razor/Components/CurrencyInput.razor
T
2026-02-08 12:26:02 +03:30

100 lines
2.3 KiB
Plaintext

@using System.Globalization
@typeparam T
@* <input type="text"
inputmode="numeric"
pattern="[0-9\s]{13,19}"
autocomplete="cc-number"
maxlength="19"
placeholder="xxxx xxxx xxxx xxxx" />
*@
<input type="text" class="@Class"
inputmode="numeric"
value="@formattedValue"
onfocus="this.select()"
@oninput="OnInputChanged"
@onblur="OnBlur"
/>
@code {
[Parameter]
public T Value { get; set; }
[Parameter]
public EventCallback<T> ValueChanged { get; set; }
[Parameter]
public string? Class { get; set; }
[Parameter]
public string? Id { get; set; }
[Parameter]
public string? PlaceHolder { get; set; }
private string formattedValue = "";
protected override void OnParametersSet()
{
formattedValue = FormatValue(Value);
}
private void OnInputChanged(ChangeEventArgs e)
{
var raw = e.Value?.ToString()?.Replace(",", "").Trim() ?? "0";
var sss = new string(raw.Where(char.IsDigit).ToArray());
if (string.IsNullOrEmpty(sss))
{
formattedValue = "0";
return;
}
object? parsed = typeof(T) switch
{
var t when t == typeof(int) && int.TryParse(raw, out var intVal) => intVal,
var t when t == typeof(long) && long.TryParse(raw, out var longVal) => longVal,
var t when t == typeof(decimal) && decimal.TryParse(raw, out var decVal) => decVal,
_ => null
};
if (parsed is T tValue)
{
ValueChanged.InvokeAsync(tValue);
}
formattedValue = raw; // temporary display while editing
}
private void OnBlur()
{
formattedValue = FormatValue(Value);
}
private void OnFocus()
{
formattedValue = FormatValue(Value);
// formattedValue = Value?.ToString();
}
private string FormatValue(T val)
{
if (val == null) return "";
return val switch
{
int i => i.ToString("N0", CultureInfo.InvariantCulture),
long l => l.ToString("N0", CultureInfo.InvariantCulture),
decimal d => d.ToString("N0", CultureInfo.InvariantCulture),
_ => val.ToString() ?? ""
};
}
}