Inferensys

Prompt

Currency String Sanitization and Conversion Prompt

A practical prompt playbook for converting inconsistent currency strings from model outputs into validated numeric amounts and ISO 4217 currency codes, ready for billing systems and financial databases.
ML engineer managing model versions on laptop, version history visible, technical Git-like workflow.
PROMPT PLAYBOOK

When to Use This Prompt

Defines the job, ideal user, and constraints for sanitizing and converting currency strings into typed numeric values with ISO 4217 validation.

This prompt is designed for fintech engineers, billing system integrators, and data pipeline operators who receive currency values in inconsistent string formats from large language models. The core job is to strip currency symbols, normalize decimal and thousand separators, handle negative amount formats, and convert the result into a predictable numeric type paired with a validated ISO 4217 currency code. Use this when a model's output contains amounts like '$1,234.56', '(€99,99)', or 'JPY 5000' that must become clean, machine-readable records before entering a ledger, payment gateway, or analytics database.

This prompt is appropriate when the currency string is semantically correct but structurally messy. It is not a currency exchange rate converter, an inflation adjuster, or a tool for interpreting ambiguous natural language like 'a few hundred dollars.' The workflow assumes you already have a string that represents a specific monetary amount and you need to coerce it into a { amount: number, currency: string } structure. The prompt includes explicit handling for accounting-style negatives (parentheses), European decimal commas, and currency codes that may be embedded in the string or provided separately as context. It also validates that the extracted currency code is a real ISO 4217 alpha-3 code, flagging unrecognized codes for human review rather than silently passing them through.

Do not use this prompt when the input is a natural-language description of value (e.g., 'around fifty bucks'), when you need real-time exchange rates, or when the currency string is part of a larger unstructured document that requires extraction before sanitization. In those cases, pair this prompt with an extraction or classification step upstream. For high-risk financial workflows, always log the original string, the sanitized output, and any normalization decisions for auditability. If the prompt cannot resolve a currency code with high confidence, escalate to a human reviewer rather than defaulting to a guess that could cause a transaction error.

PRACTICAL GUARDRAILS

Use Case Fit

Where this prompt works and where it does not. Understand the operational boundaries before integrating it into a financial or billing pipeline.

01

Good Fit: Inconsistent User Input

Use when: You are ingesting currency strings from user-facing forms, CSVs, or external APIs where the format is unpredictable (e.g., '$1,234.56', '1234,56 €', '(99.99)'). Guardrail: The prompt excels at normalizing diverse human-readable conventions into a strict numeric type and ISO 4217 code.

02

Bad Fit: High-Volume Transaction Processing

Avoid when: You need to sanitize millions of records in a real-time billing system. Guardrail: LLM inference is too slow and expensive for this scale. Use the prompt to generate a test suite and build a deterministic regex/parser in application code for production throughput.

03

Required Inputs

What to watch: The prompt cannot succeed without clear context. Guardrail: You must provide the raw currency string, the expected ISO 4217 currency code for disambiguation, and the target output schema. Missing the currency code leads to locale guesswork and silent failures.

04

Operational Risk: Silent Misinterpretation

What to watch: The model might misinterpret '1,234' as one thousand two hundred thirty-four or one point two three four depending on assumed locale. Guardrail: Always log the raw input, the model's normalized output, and the currency code hint for auditability. Implement a hard validation check that the output is a finite number.

05

Operational Risk: Negative Amount Handling

What to watch: Accounting formats like '(200.00)' or '200.00 DR' are semantically negative but syntactically tricky. Guardrail: Explicitly test these patterns in your eval set. The prompt must be instructed to convert accounting notation to a standard negative sign, not just strip parentheses.

06

Variant: Locale-Specific Separators

What to watch: European locales use '.' as a thousands separator and ',' as a decimal separator, the inverse of the US/UK convention. Guardrail: If you cannot provide a locale hint, the prompt must be paired with a pre-processing step that detects the pattern or a post-processing validation that flags ambiguous cases for human review.

PROMPT PLAYBOOK

Copy-Ready Prompt Template

A reusable prompt with square-bracket placeholders for sanitizing and converting currency strings into clean numeric values with ISO 4217 validation.

This prompt template is designed to be copied directly into your AI harness, test suite, or orchestration layer. It accepts a raw currency string and a set of configuration parameters, then returns a structured JSON object containing the sanitized numeric value, the detected or confirmed ISO 4217 currency code, and a confidence score. The template uses square-bracket placeholders exclusively so you can safely perform string replacement in any programming language without conflicting with JSON braces or model-specific template syntax.

text
You are a currency sanitization engine. Your job is to convert a raw currency string into a clean numeric value and a validated ISO 4217 currency code.

INPUT:
[INPUT]

CONSTRAINTS:
[CONSTRAINTS]

OUTPUT_SCHEMA:
{
  "original": "string (the raw input)",
  "amount": "number (the sanitized numeric value as a float)",
  "currency_code": "string (the 3-letter ISO 4217 code, uppercase)",
  "confidence": "number between 0.0 and 1.0",
  "warnings": ["string (any issues detected during conversion)"]
}

RULES:
1. Strip all currency symbols ($, €, £, ¥, etc.) and whitespace.
2. Normalize decimal separators: treat the last occurrence of ',' or '.' as the decimal separator when ambiguous, based on the detected locale or currency convention.
3. Handle negative amount formats: leading minus, parentheses, 'CR', 'DB', and trailing minus signs.
4. If a currency symbol or code is present, map it to the correct ISO 4217 code. If only a symbol is present and it is ambiguous (e.g., $ for USD/CAD/AUD), set confidence to 0.5 and include a warning.
5. If no currency indicator is present and [DEFAULT_CURRENCY] is provided, use that code and set confidence to 0.3.
6. If the input cannot be parsed, set amount to null, confidence to 0.0, and include a descriptive warning.
7. Do not perform any currency conversion. Return the amount as parsed.
8. Return ONLY the JSON object. No markdown fences, no explanatory text.

To adapt this template, replace [INPUT] with the raw currency string from your model output or user input. Replace [CONSTRAINTS] with any additional rules, such as a maximum allowed value, a list of acceptable currency codes, or locale hints. If you want a fallback currency when none is detected, add a [DEFAULT_CURRENCY] placeholder and wire it into your application logic before sending the prompt. For high-risk financial workflows, always validate the output against your own ISO 4217 registry and numeric range checks before ingestion. This prompt is a sanitization step, not a financial calculation engine—it should feed into, not replace, your existing validation pipeline.

IMPLEMENTATION TABLE

Prompt Variables

Required inputs for the Currency String Sanitization and Conversion Prompt. Each placeholder must be populated before the prompt is assembled and sent to the model. Validation notes describe how to verify the input is well-formed before execution.

PlaceholderPurposeExampleValidation Notes

[CURRENCY_STRING]

The raw currency value to sanitize and convert

$1,234.56

Must be a non-empty string. Can include currency symbols, thousand separators, decimal separators, negative signs, and whitespace. Reject null or undefined inputs before prompt assembly.

[TARGET_CURRENCY_CODE]

ISO 4217 currency code to validate against or convert to

USD

Must be a valid 3-letter ISO 4217 code. Validate against a maintained currency code list. Reject unknown codes. Set to null if no currency conversion is needed and only sanitization is required.

[OUTPUT_TYPE]

Desired numeric output type for the sanitized value

decimal

Must be one of: 'integer', 'decimal', 'float', 'string'. 'decimal' preserves exact precision. 'float' allows scientific notation. 'integer' rounds or truncates per [ROUNDING_MODE].

[ROUNDING_MODE]

Rounding strategy when converting to integer or reducing precision

HALF_UP

Must be one of: 'HALF_UP', 'HALF_DOWN', 'HALF_EVEN', 'UP', 'DOWN', 'TRUNCATE'. Default to 'HALF_EVEN' for financial applications. Ignored when [OUTPUT_TYPE] is 'decimal' or 'string'.

[DECIMAL_PLACES]

Number of decimal places to retain in the output

2

Must be a non-negative integer. Typical values: 0 for integer currencies (JPY, KRW), 2 for most others, 3-4 for cryptocurrency or high-precision use cases. Ignored when [OUTPUT_TYPE] is 'integer'.

[LOCALE_HINT]

Locale context for disambiguating decimal and thousand separators

en-US

Must be a valid BCP 47 locale tag or null. Used to resolve ambiguous formats like '1,234' (thousands in en-US, decimal in de-DE). Set to null to rely on heuristic detection with lower confidence.

[NEGATIVE_FORMAT_HINT]

Expected format for negative amounts in the input

PARENTHESES

Must be one of: 'MINUS_SIGN', 'PARENTHESES', 'CR_SUFFIX', 'DB_SUFFIX', 'ANGLE_BRACKETS', 'AUTO'. 'AUTO' triggers heuristic detection. Use explicit hints when the input source has a known convention.

[STRICT_VALIDATION]

Whether to reject inputs that cannot be parsed with high confidence

Must be a boolean. When true, unparseable inputs produce an error instead of a best-effort guess. When false, the prompt attempts recovery and includes a confidence score in the output. Set true for financial reconciliation and billing pipelines.

PROMPT PLAYBOOK

Implementation Harness Notes

How to wire the currency sanitization prompt into a fintech or billing application with validation, retries, and audit trails.

This prompt is designed to be a post-generation repair step, not a standalone service. In a production fintech or billing pipeline, you will typically call this prompt after a primary model has generated a transaction description, invoice line item, or payment record that contains a currency string. The prompt expects a raw currency string as [INPUT] and an optional ISO 4217 currency code as [EXPECTED_CURRENCY]. It returns a structured JSON object with the sanitized numeric value, the detected or validated currency code, and a confidence score. Wire this into your application as a synchronous validation gate before any database insert or API call to a payment processor.

Validation and retry logic is critical here. After receiving the prompt's JSON response, your application code must validate that the confidence field exceeds your configured threshold (we recommend >= 0.95 for financial writes). If confidence is lower, or if the error field is populated, do not silently default the value. Instead, implement a retry loop with a maximum of 2 additional attempts, each time appending the previous error message to the [PREVIOUS_ERRORS] placeholder in the prompt context. If all retries fail, route the record to a human review queue with the original raw string, all repair attempts, and the final error payload. Never write a low-confidence numeric value to a ledger or trigger a payment without human approval.

Logging and audit requirements for financial systems demand that every sanitization call is recorded. Log the full prompt input (excluding any PII in surrounding fields), the raw model response, the parsed output, and the final decision (passed, repaired, or escalated). Use structured logging with a unique repair_id per record so that auditors can trace any currency conversion from raw input to final stored value. For model choice, prefer a fast, cost-effective model like gpt-4o-mini or claude-3-haiku for this task, as it is a narrow extraction and normalization problem that does not require deep reasoning. If you are processing high volumes, batch these calls asynchronously and implement a circuit breaker that halts processing if the error rate exceeds 5% in a rolling 5-minute window, preventing a prompt failure from corrupting your entire transaction pipeline.

IMPLEMENTATION TABLE

Expected Output Contract

Fields, types, and validation rules for the normalized currency output. Use this contract to build a post-processing validator or to configure a retry loop when the model output fails these checks.

Field or ElementType or FormatRequiredValidation Rule

normalized_amount

number (float64)

Must be a finite number. No NaN, Infinity, or overflow values. Precision must not exceed 6 decimal places unless config overrides.

currency_code

string (ISO 4217)

Must match exactly 3 uppercase letters from the active ISO 4217 currency code list. No historical or crypto codes unless explicitly allowed in [ALLOWED_CURRENCIES].

original_input

string

Must be a non-empty string. Must be a verbatim copy of the [INPUT] string before any transformation.

sign

string enum

Must be exactly 'positive', 'negative', or 'zero'. Derived from the parsed amount, not from heuristic analysis of the input string.

decimal_separator_used

string enum

Must be exactly 'period' or 'comma' as detected in the original input. Used for audit trail, not for output formatting.

confidence

number (0.0-1.0)

Must be a float between 0.0 and 1.0 inclusive. If confidence is below [CONFIDENCE_THRESHOLD], the entire record must be flagged for human review.

parsing_notes

string or null

If not null, must be a non-empty string describing ambiguity, repair actions taken, or assumptions made during normalization. Must not contain PII from the input.

PRACTICAL GUARDRAILS

Common Failure Modes

Currency string sanitization fails in predictable ways. These are the most common production failure modes and the guardrails that catch them before they corrupt downstream systems.

01

Decimal Separator Ambiguity

What to watch: The model misinterprets European-style separators (1.234,56) as thousand separators, producing values off by orders of magnitude. This is the most expensive currency bug in production. Guardrail: Always pass an explicit locale hint in the prompt. Validate that the output falls within an expected range before ingestion. Flag any value where the decimal position is ambiguous.

02

Negative Amount Format Confusion

What to watch: Accounting-style negatives (-$100), parentheses ($100), and CR suffix ($100 CR) are interpreted inconsistently. The model sometimes strips the sign entirely, turning a refund into a charge. Guardrail: Include all expected negative formats in few-shot examples. Add a post-processing check that compares the output sign against the input string's semantic meaning.

03

Currency Symbol Stripping Without Code Validation

What to watch: The model strips the symbol correctly but returns no ISO 4217 code, or returns a code that doesn't match the symbol (e.g., $ mapped to MXN instead of USD). Guardrail: Require the model to output both the numeric value and the currency code. Cross-validate the code against a known symbol-to-code mapping. Reject outputs where the code is missing or mismatched.

04

Precision Loss on Large or Small Amounts

What to watch: The model converts to a float and loses precision on amounts with many significant digits, or truncates sub-cent values in high-precision contexts like cryptocurrency or gas fees. Guardrail: Specify the exact decimal precision required in the output schema. Use string-based decimal representation in the prompt to avoid floating-point drift. Validate that the output preserves all significant digits from the input.

05

Multi-Currency String Confusion

What to watch: Inputs like 'USD 100 / EUR 92' or '100 USD/EUR' cause the model to pick one currency arbitrarily or hallucinate a conversion rate. Guardrail: Explicitly instruct the model to extract each currency-value pair separately when multiple currencies are detected. If the task is single-value extraction, reject inputs with ambiguous multi-currency strings and escalate for human review.

06

Whitespace and Non-Printable Character Corruption

What to watch: Non-breaking spaces, thin spaces used as thousand separators, or zero-width characters embedded in currency strings survive sanitization and break downstream numeric parsing. Guardrail: Normalize all whitespace to ASCII space before processing. Strip all zero-width and control characters. Validate that the cleaned string parses as a number before accepting the model's output.

IMPLEMENTATION TABLE

Evaluation Rubric

Use this rubric to test the quality of the currency sanitization prompt before shipping. Each criterion includes a pass standard, a failure signal, and a test method that can be automated in a CI pipeline or eval harness.

CriterionPass StandardFailure SignalTest Method

Currency Symbol Stripping

All leading/trailing currency symbols ($, €, £, ¥) are removed from [INPUT_AMOUNT] and not present in [OUTPUT_AMOUNT]

Output contains any currency symbol character

Regex check: output must not match /[$€£¥]/g

Negative Amount Handling

Negative amounts expressed as '(123.45)' or '-123.45' are converted to a negative numeric value with a leading minus sign

Output is positive when input indicates a negative amount or output contains parentheses

Parse output as float; assert sign matches input intent for 10 test cases including accounting-style negatives

Decimal Separator Normalization

European-style '1.234,56' and standard '1,234.56' both normalize to a period decimal separator with no thousand separators

Output contains comma as decimal separator or retains thousand separators

Assert output matches /^-?\d+.\d{2}$/ for all locale variants in test set

ISO 4217 Currency Code Validation

[OUTPUT_CURRENCY_CODE] is a valid 3-letter ISO 4217 code matching the detected or provided currency

Output code is not in ISO 4217 list or mismatches the input currency symbol

Validate output against a hardcoded set of valid ISO 4217 codes; cross-check symbol-to-code mapping

Numeric Type Conversion

[OUTPUT_AMOUNT] is a valid floating-point number with exactly 2 decimal places

Output is a string, integer, or has incorrect decimal precision

typeof check in test harness; assert output passes parseFloat() without NaN and has 2 decimal digits

Whitespace and Artifact Removal

Output contains no leading/trailing whitespace, newlines, or non-printable characters

Output has spaces, tabs, or newlines before or after the numeric value

Trim output and assert length equals original length; check for /\s/ at boundaries

Null or Empty Input Handling

When [INPUT_AMOUNT] is null, empty, or whitespace-only, [OUTPUT_AMOUNT] returns null and [ERROR_FLAG] is true

Output returns '0.00', empty string, or throws an unhandled error

Pass null, '', and ' ' as inputs; assert output_amount is null and error_flag is true

Ambiguous Format Escalation

When input is ambiguous (e.g., '1.234' could be 1234 or 1.234), [CONFIDENCE_SCORE] is below 0.8 and [REQUIRES_REVIEW] is true

System silently picks one interpretation with high confidence

Feed ambiguous test cases; assert confidence_score < 0.8 and requires_review is true

ADAPTATION OPTIONS

Adapt This Prompt

How to adapt

Start with the base prompt and a single test case. Use a lightweight validation step that checks only the output type (float) and ISO code presence. Skip locale detection logic—hardcode a single expected format (e.g., US decimal separator). Accept the model's first parse attempt without retry logic.

code
Strip currency symbols and thousand separators from [INPUT_STRING].
Convert to float. Return {"amount": float, "currency": "USD"}.

Watch for

  • Negative amounts formatted with parentheses (e.g., (1,234.56)) being parsed as positive
  • European decimal commas (1.234,56) silently producing wrong values
  • Missing currency code when the symbol is ambiguous ($ = USD vs CAD vs AUD)
Prasad Kumkar

About the author

Prasad Kumkar

CEO & MD, Inference Systems

Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.

His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.