It is tempting to describe this as "the inverse of TEXT", and that is the right intuition, but
the honest description is narrower and stranger: VALUE accepts the text forms that Excel itself
would recognise as a number if you typed them into a cell, under the current locale, and returns
the number they denote. That is not a fixed grammar. It is a grammar parameterised by the
machine's regional settings.
The forms in play include, at minimum: plain decimals, scientific notation, digit-group separators,
a currency symbol, a percent sign, and date and time text. Each of those brings a locale
dependency:
the decimal separator is . in some locales and , in others, which means "1,5" is one
and a half in one place and fifteen — or a rejection — in another;
the group separator is the mirror image of that problem, and a space in several locales;
the currency symbol is per-locale, and VALUE accepting "$1.00" says nothing about whether
it accepts "€1,00"; in the recorded en-ZA settings "€1" is read and "$1" is not
(FN-VALUE-003);
date text is the worst case, because "1/2/2024" denotes two different days in two locales
and returns a serial number, not the digits you can see.
The Handbook's shared coercion chapter already draws this boundary: it pins the plain-number core
and states that the locale-dependent surface — separators, currency, percent, date and time text —
is an open area. See coercion and lifting. VALUE is the
function where that open area is the entire subject matter.
Two structural facts finish the definition. A number arriving as the argument passes through
unchanged. And a successful date-text parse returns the date's serial number — a plain
Number, formatting-free — which is why VALUE("2024-01-02") shows as a large integer unless the
cell is formatted as a date.
Arguments
VALUE(text)
Argument
Required
Meaning
text
yes
The text to convert to a number.
One argument. The subtleties are all about what may occupy it:
Already-numeric input passes through. VALUE(5) is 5.
Logicals are the surprising rejection: upstream's contract records logical, blank, missing,
and unsupported aggregate or reference payloads as #VALUE! in its admitted slice — so VALUE
is stricter than the general to-number coercion, which maps TRUE to 1. That is a real
difference between VALUE(TRUE) and SUM(TRUE), and it is upstream's recorded behaviour rather
than a Handbook finding.
Leading and trailing whitespace is ignored by the general to-number rule; whether VALUE
matches that exactly, and whether a whitespace-only string is rejected as upstream records, is
worth confirming rather than assuming.
An empty referenced cell delivers Empty, which is a distinct outcome from an omitted
argument; see the value universe.
Try it
Quirks
Result and edge cases
The return kind is Number.
Edges that matter in practice:
Percent text divides. If "50%" is accepted, the result is 0.5, not 50. A pipeline that
parses percentages with VALUE and then divides by 100 is wrong by a factor of 100 exactly when
the parse succeeds.
Date and time text returns serials. Time text returns a fraction of a day. VALUE("12:00")
is 0.5 if accepted.
Overflow is not infinity. The shared coercion rule states that text parsing must produce a
finite number; text denoting an overflow is treated as non-numeric rather than as infinity.
Precision is the parser's, not the text's.VALUE of a 30-digit numeral returns the nearest
double, silently. Round-tripping through TEXT and back is lossy in both directions and the
losses do not cancel.
Arrays. Whether VALUE lifts over an array argument is not something this page asserts; the
general rules are in coercion and lifting, and the
specific answer for VALUE is listed as an open probe below.
Errors propagate.
Errors
Microsoft's page is the authority on the documented error conditions and is linked below; it was
not retrievable while this entry was written, so this section states expectations rather than
quoting it.
Error
Status
#VALUE! when the text is not in a recognised numeric or date/time format
expected; this is the function's characteristic failure
#VALUE! for logical, blank, and unsupported argument kinds
recorded upstream for its admitted slice; not a Handbook claim, and notably stricter than general to-number coercion
any error value, propagated from the argument
follows from the universal error-propagation rule
Note what is not here: there is no error for precision loss, and none for a value that parses but
means something other than what the author intended. VALUE fails loudly or succeeds silently.
Text to number checks the exponent range even when the mantissa is zero
Converting text to a number, measured through ABS and VALUE, rejects a zero mantissa with an out-of-range exponent: ABS("0e-309") is #VALUE! though the text denotes 0, and ABS("0e-308") is 0. The exponent counts as written, less the fraction digits, less 2 for a percent sign, so ABS("0.0e309") is 0, ABS("0e309") is #VALUE!, and ABS("0e-307%") is #VALUE!.
Explanation (inferred): The exponent formula is inferred, though it fits every reading; that functions other than ABS and VALUE share this conversion is inferred.
Formula
Excel
Mathematical value
=ABS("0e-309") Excel build not recorded in this run; bulk captures of the same date (2026-09-29) record Excel 16.0 build 20430, Windows 64-bit, workbook compatibility 2Inputs and reference value
Typed formula.
The text denotes zero: a zero mantissa is 0 at any exponent.
#VALUE!
0 0x0000000000000000
=ABS("0e-308") Excel build not recorded in this run; bulk captures of the same date (2026-09-29) record Excel 16.0 build 20430, Windows 64-bit, workbook compatibility 2Inputs and reference value
Typed formula.
0 0x0000000000000000
—
=ABS("0e-307%") Excel build not recorded in this run; bulk captures of the same date (2026-09-29) record Excel 16.0 build 20430, Windows 64-bit, workbook compatibility 2Inputs and reference value
Typed formula.
#VALUE!
—
=ABS("0e309") Excel build not recorded in this run; bulk captures of the same date (2026-09-29) record Excel 16.0 build 20430, Windows 64-bit, workbook compatibility 2Inputs and reference value
Typed formula.
The text denotes zero: a zero mantissa is 0 at any exponent.
#VALUE!
0 0x0000000000000000
=ABS("0.0e309") Excel build not recorded in this run; bulk captures of the same date (2026-09-29) record Excel 16.0 build 20430, Windows 64-bit, workbook compatibility 2Inputs and reference value
Typed formula.
0 0x0000000000000000
—
=VALUE("0e-307") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
0 0x0000000000000000
—
=VALUE("0e-307%") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("0e309") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("0.0e309") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
0 0x0000000000000000
—
=VALUE("0e309%") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
0 0x0000000000000000
—
=VALUE("0e311%") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Text to number reads Arabic, Persian, Devanagari and Thai digits, but not fullwidth digits
In the recorded en-ZA settings, converting text to a number accepts Arabic-Indic (U+0660 to U+0669), extended Arabic-Indic (U+06F0 to U+06F9), Devanagari (U+0966 to U+096F) and Thai (U+0E50 to U+0E59) digits. They work alone, in runs, with a decimal point, in the exponent, with a sign or percent, and mixed with ASCII digits or with each other: VALUE("1٢3") is 123, and SQRT of a four-digit string using four scripts is the root of 1234. Fullwidth digits (U+FF10 to U+FF19) give #VALUE! alone or mixed. DATEVALUE reads the four accepted scripts in a date written year-month-day.
Explanation (inferred): That other text-to-number routes, such as arithmetic operators, treat digits the same way is inferred from VALUE and SQRT agreeing.
Formula
Excel
Mathematical value
=VALUE("١") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
1 0x3ff0000000000000
—
=VALUE("١٢٣") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
123 0x405ec00000000000
—
=VALUE("1٢3") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
123 0x405ec00000000000
—
=VALUE("١e2") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
100 0x4059000000000000
—
=VALUE("१") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
1 0x3ff0000000000000
—
=VALUE("๑") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
1 0x3ff0000000000000
—
=VALUE("1") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("123") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=SQRT("۱٢३๔") Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Typed formula.
35.12833614050059 0x4041906d51932c26
—
=DATEVALUE("٢٠٢٤-٠١-٠٢") Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
A date as text takes at most two digits for month and day
In a three-part numeric date, leading zeros are not free. VALUE("2024/02/01") is 45323, but VALUE("2024/02/001") and VALUE("2024/002/01") are #VALUE!, and so is any month or day of three or more digits in the 45 forms read. A year of one, two or four digits is read: "1/2/1" and "1/02/01" are 2001-02-01, "24/2/1" is 2024-02-01, while "0001/2/1" is #VALUE!. Month 0 and day 0 give #VALUE!. The same limit holds with hyphens: "2024-02-001" through VALUE, and "2024-002-01" and "2024-02-001" through DATEVALUE, are #VALUE!. The settings of this run are en-ZA: decimal point, space as thousands separator, year-month-day date order.
Formula
Excel
Mathematical value
=VALUE("2024/02/01") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
45323 0x40e6216000000000
—
=VALUE("2024/02/001") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("2024/002/01") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("1/2/1") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
36923 0x40e2076000000000
—
=VALUE("24/2/1") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
45323 0x40e6216000000000
—
=VALUE("0001/2/1") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("2024/02/0") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("2024-02-001") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=DATEVALUE("2024-002-01") Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
VALUE takes one percent sign anywhere around parentheses, and a euro sign but not a dollar
VALUE reads parentheses as a negative sign and one percent sign in any of these places: "(1)%", "(1) %", "(1%)", "(%1)" and "%(1)" are all -0.01. A second percent sign, as in "(1%)%", "%(1)%" and "(1)%%", gives #VALUE!, as does trailing text. The euro sign is read as a currency sign in the recorded en-ZA settings: "€1", "1€", "€ 1", "€-1", "-€1", "(€1)" and "€(1)" are 1 or -1. "$1" and "£1" are #VALUE! there. Currency and percent do not combine: "€1%", "(€1)%" and "(R1)%" are #VALUE!.
Formula
Excel
Mathematical value
=VALUE("(1)%") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
-0.01 0xbf847ae147ae147b
—
=VALUE("(%1)") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
-0.01 0xbf847ae147ae147b
—
=VALUE("%(1)") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
-0.01 0xbf847ae147ae147b
—
=VALUE("(1%)%") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("€1") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
1 0x3ff0000000000000
—
=VALUE("1€") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
1 0x3ff0000000000000
—
=VALUE("€(1)") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
-1 0xbff0000000000000
—
=VALUE("€1%") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("$1") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#VALUE!
—
=VALUE("£1") Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Make the locale an explicit input, not ambient state. Upstream's design — a locale-profile
seam queried from the host, with the parser written against the profile — is the right shape.
A parser that reads the process locale at call time is untestable and irreproducible.
Do not use the host language's number parser.strtod, double.Parse, and f64::from_str
each accept things Excel does not (hex floats, inf, nan, underscores in some languages) and
reject things Excel does (currency symbols, percent, grouped digits). Every one of those
mismatches is a silent divergence.
Reject non-finite parses. The shared rule is explicit: text that parses to an overflow is
non-numeric, not infinite.
Keep the date lane separate from the number lane, and be prepared for the two to disagree
about the same string — "1.5" as a number and as a date are both plausible readings, and the
precedence between them is a real decision that must be recorded.
Percent must compose with grouping rather than being a separate grammar, but it does not
combine with currency: "€1%" is #VALUE! in the recorded en-ZA settings (FN-VALUE-003). It
also counts toward the exponent range check: "0e-307" is 0 but "0e-307%" is #VALUE!
(FN-ABS-001).
Round once. Parse to the exact decimal value and round to the nearest double a single time;
parsing digit-by-digit with accumulating multiplication introduces error that no test of small
numerals will catch. Excel also checks the exponent range when the mantissa is zero, so
"0e309" is #VALUE! (FN-ABS-001).
Rust code
Show the CalcFunc source of this function
Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.
No implementation has been published with a Handbook test suite for this function.
Version differences
No comparison between specific Excel builds is recorded here yet. This does not establish that all builds behave alike.
Excel 16.0.20527.20088
Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
=VALUE("0e-307") returned 0 (0x0000000000000000). =VALUE("0e-307%") returned #VALUE!. 30 further recorded controls are attached. Inputs were supplied through formula literals. These are controls from this environment, not a same-input comparison with another build.
TEXT — the opposite direction, and the function VALUE is usually paired with. TEXT is
equally locale-dependent, in the format-string argument as well as the output, which means a
VALUE(TEXT(x, fmt)) round trip is doubly exposed to locale.
NUMBERVALUE — the function you probably want. It takes explicit decimal and group separator
arguments, which removes the ambient-locale dependency that makes VALUE non-portable.
NUMBERVALUE does not supersede VALUE in Microsoft's catalogue and both remain current, but
for any workbook that travels between machines, NUMBERVALUE is the safer instrument. Upstream
notes that NUMBERVALUE's own locale-default lanes are separately blocked and unresolved, so it
is not a free lunch either.
-- (double unary minus) and +0 are the idiomatic shorthands for text-to-number coercion. They
go through the general to-number rule described in
coercion and lifting, not through VALUE's parser, so
they are not interchangeable with VALUE — most visibly for logicals.
DATEVALUE and TIMEVALUE — the specialised parsers for the date and time lanes that VALUE
also happens to cover. When you know you have a date, they say so in the formula and are easier
to reason about.
VALUETOTEXT is not the inverse of VALUE despite the name symmetry; see
VALUETOTEXT, which renders any value as text for display or for
formula-bar round-tripping.
ISNUMBER(VALUE(x)) is the common "does this parse" test, and it inherits every locale question
on this page.