# Money

> Monetary amount with currency code (ISO 4217) and optional formatted string.

- Name: `money`
- Categories: common
- Detail page: https://open-types.dev/types/money

## Install

```bash
# Types only
npx shadcn add @open-types/money

# Types + Zod v4 validators
npx shadcn add @open-types/money-zod

# Types + real-world examples
npx shadcn add @open-types/money-examples
```

## Types

```typescript
export interface Money {
  amount: number;
  currency: string;
  formatted?: string;
}
```

## Zod validator

```typescript
import * as z from "zod";
import type { Money } from "../types/money";

const ISO_CURRENCY_REGEX = /^[A-Z]{3}$/;

export const moneySchema = z.object({
  amount: z.number(),
  currency: z
    .string()
    .transform((value) => value.toUpperCase())
    .pipe(
      z.string().regex(ISO_CURRENCY_REGEX, {
        error: "Currency must be a 3-letter ISO code",
      })
    ),
  formatted: z.string().optional(),
}) satisfies z.ZodType<Money>;

export type { Money } from "../types/money";
```

## Examples

```typescript
// Source: hand-crafted
import type { Money } from "../types/money";

export const moneyExamples = {
  usd: { amount: 19_99, currency: "USD", formatted: "$19.99" } satisfies Money,
  eur: { amount: 99_00, currency: "EUR" } satisfies Money,
  jpyZeroDecimal: { amount: 12500, currency: "JPY", formatted: "¥12,500" } satisfies Money,
  zero: { amount: 0, currency: "USD" } satisfies Money,
  negative: { amount: -250, currency: "USD", formatted: "-$2.50" } satisfies Money,
  large: { amount: 999_999_999, currency: "USD" } satisfies Money,
} as const;
```
