金額入力CurrencyInputExperimental
Money editor: a currency-symbol-prefixed, thousands-grouped, right-aligned amount input that formats while typing and emits a numeric value. JPY-first; for invoices, payroll, expenses, and any fintech amount field.
プレビュー
入力値は数値として保持し、表示時だけ通貨表記にします。
保存される値
1200000
表示: ¥1,200,000
状態とバリエーション
標準
JPY の金額を数値として保持し、入力中は桁区切りを維持します。
入力値は数値として保持し、表示時だけ通貨表記にします。
保存される値
1200000
表示: ¥1,200,000
通貨違い
currency と locale を組み合わせて、海外請求額の記号と桁区切りを変えます。
入力値は数値として保持し、表示時だけ通貨表記にします。
保存される値
1280
表示: $1,280.00
記号なし
表や一覧で通貨単位が別に示されている場合は showSymbol=false にできます。
表では記号を列見出しに置くため、入力欄では非表示にします。
保存される値
1200000
表示: ¥1,200,000
無効化
確定済み金額は無効化し、操作対象の上で理由を説明します。
入力値は数値として保持し、表示時だけ通貨表記にします。
保存される値
1200000
表示: ¥1,200,000
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| label | ReactNode | - | 入力欄の上に表示するラベルです。id と紐づけて読み上げにも使います。 |
| description | ReactNode | - | 入力欄の下に表示する補足文です。aria-describedby に接続されます。 |
| value / defaultValue | number | - | 金額の数値です。value を渡すと controlled、defaultValue では uncontrolled として動きます。 |
| onValueChange | (value: number | undefined) => void | - | 入力値が数値に変換された時に呼ばれます。空欄では undefined を返します。 |
| currency | string | "JPY" | 通貨記号と表示に使う ISO 4217 コードです。 |
| locale | string | "ja-JP" | 桁区切りと通貨記号の表示に使う locale です。 |
| showSymbol | boolean | true | 先頭の通貨記号を表示するかを指定します。 |
| min / max | number | - | 入力できる金額の下限と上限です。入力中に範囲内へ丸めます。 |
| disabled | boolean | - | 金額入力を無効化します。docs では理由を Tooltip で説明します。 |
使い方
import * as React from "react";
import { CurrencyInput, formatCurrency } from "@gunjo/ui";
export function InvoiceAmountField() {
const [amount, setAmount] = React.useState<number | undefined>(1200000);
return (
<div className="flex w-full max-w-sm flex-col gap-3">
<CurrencyInput
id="invoice-amount"
label="請求金額"
description="入力値は数値として保持し、表示時だけ通貨表記にします。"
value={amount}
onValueChange={setAmount}
min={0}
max={5000000}
currency="JPY"
locale="ja-JP"
/>
<p className="text-sm text-muted-foreground">
表示: {amount !== undefined ? formatCurrency(amount) : "未入力"}
</p>
</div>
);
}使用コンポーネント
関連コンポーネント
設計の判断(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。