Turn Decimals into Human-Readable Percentages in Excel (with TEXT()): The Complete Guide

If your reports still say “0.872” instead of “87.2%”, this article is for you.

In day-to-day dashboards, status emails, and management summaries, we rarely want raw decimals. We want clear, human-readable statements like:

“Employee Elira met the target with 87.2%.”

That’s where Excel’s TEXT() function shines: it formats a number as a string, so you can embed the percentage directly inside a sentence, without manually changing cell formatting or copy-pasting values.

This guide is written in my usual style: practical, detailed, and no fluff. You’ll learn when to use TEXT(), the exact patterns to use, and what can go wrong (and how to fix it). I’ll also show some alternatives (CONCAT, TEXTJOIN, LET, IF, ROUND).

TL;DR: Core Formula You’ll Use All the Time

=A2 & ” met the target with ” & TEXT(B2, “0.0%”)

  • A2 = employee name
  • B2 = decimal value (e.g., 0.945)
  • “0.0%” = display as percent with one decimal place (e.g., 94.5%)

Result:
Erion met the target with 94.5%

Why TEXT() (and not just cell formatting)?

Cell formatting changes how a number looks in a cell. But when you need to build a message for an email body, a dashboard label, a comment column, or export, you often need the percentage inside a text string. TEXT() lets you do exactly that, with full control over decimal places.

Read also:  The Ultimate Guide to the Compounding Formula in Excel

Real-World Use Case (The One You Asked For)

Let’s say you maintain a performance table with Employee, Target Achievement (decimal), and you want a Message column you can copy straight into emails or status slides.

Without TEXT() (the “bad” version)

Hard to read. Not executive-friendly.

With TEXT() (the “good” version)

Formula in Message (row 2):

=A2 & ” met the target with ” & TEXT(B2, “0.0%”)

Copy down and you’re done. Now your column is readable, professional, and ready to paste anywhere.

Percent Formatting Cheat-Sheet (drop-in patterns)

Choose exactly how many decimals you want:

TEXT(B2, “0%”)      // 87%

TEXT(B2, “0.0%”)    // 87.2%

TEXT(B2, “0.00%”)   // 87.23%

TEXT(B2, “#%”)      // 87   (no forced leading zero)

TEXT(B2, “0.##%”)   // 87.2 or 87.23 (shows up to 2 decimals as needed)

Tip: For consistent reporting, pick a standard (often “0.0%”) and stick to it.

Best-Practice Pattern (Concise, modern Excel)

  • With CONCAT (Excel 2016+ / 365):

=CONCAT(A2, ” met the target with “, TEXT(B2, “0.0%”))

  • With TEXTJOIN (ideal for longer messages):

=TEXTJOIN(“”, TRUE, A2, ” met the target with “, TEXT(B2, “0.0%”))

  • With LET (cleaner, maintainable) (Excel 2021+ / 365):

=LET(

name, A2,

pct,  B2,

CONCAT(name, ” met the target with “, TEXT(pct, “0.0%”))

)

  • With conditionals (success/fail messaging):

=IF(B2>=1,

CONCAT(A2, ” exceeded the target with “, TEXT(B2, “0.0%”)),

CONCAT(A2, ” reached “, TEXT(B2, “0.0%”), ” of the target”)

)

Common Pitfalls (and how to avoid them)

1) “My totals stopped working!”

TEXT() returns text, not a number. If you later try to sum or average that text column, you’ll get wrong results.

Fix: Keep two columns:

  • A numeric column for calculations (e.g., Target Achievement as decimal).
  • A display column for messaging using TEXT().

2) Sorting looks weird

When you sort a text percentage column, Excel sorts it alphabetically (“100%” < “87%” because “1” comes before “8”).

Fix: Sort by the numeric column, not the message column.

3) Rounding surprises

TEXT(B2,”0%”) rounds for display (0.994 → 99%). If your stakeholders need precise control:

=A2 & ” met the target with ” & TEXT(ROUND(B2,3), “0.0%”)

Round before TEXT().

4) Blanks and errors

If B2 is blank or erroring, your sentence breaks. Use ‘IFERROR’

=IFERROR(

  CONCAT(A2, ” met the target with “, TEXT(B2, “0.0%”)),

  CONCAT(A2, ” has no available result”)

)

Or suppress blanks:

=IF(B2=””,””,CONCAT(A2, ” met the target with “, TEXT(B2, “0.0%”)))

5) Locale issues (comma vs dot)

In some locales, Excel expects comma as a decimal separator and semicolon as a function argument separator.

  • Use the argument separator your Excel expects.
  • The format string inside TEXT() still uses . for decimal places and % for percent. That’s normal.
Read also:  Pivot Table Anomalies: Common Issues and How to Fix Them

When to Prefer Cell Formatting (not TEXT())

If you don’t need a sentence and only want a cell to look like a percentage:

  • Use Home → Number → Percentage (%) or a Custom Format (e.g., 0.0%).
  • This keeps the value numeric and fully calculable.

Rule of thumb:

  • Need a sentence → use TEXT().
  • Need a number for math → use cell formatting.

Advanced: Build Email-Ready Lines Automatically

If you keep an employee list and want to generate a batch of clean sentences for email or Slack:

=TEXTJOIN(CHAR(10), TRUE,

  A2 & “: ” & TEXT(B2, “0.0%”),

  B3 & “: ” & TEXT(C3, “0.0%”),

  B4 & “: ” & TEXT(C4, “0.0%”)

)

  • CHAR(10) inserts a line break (enable Wrap Text).
  • Paste the result straight into your message.

Dynamic arrays (Excel 365): If names are in A2:B100 and percentages in B2:C100, you can spill:

=TEXTJOIN(CHAR(10), TRUE, A2:B100 & “: ” & TEXT(B2:C100, “0.0%”))

Note: TEXTJOIN with arrays works beautifully in 365. In older versions, consider helper columns.

Conditional Messaging with Status Labels

Make your message smarter:

=LET(

  name, A2,

  pct,  B2,

  label, IF(pct>=1, “Exceeded”, IF(pct>=0.9, “Near target”, “Below target”)),

  CONCAT(label, ” — “, name, ” at “, TEXT(pct, “0.0%”))

)

Examples:

  • Exceeded : Besi at 102.3%
  • Below target : Elira at 87.2%

CONCAT vs TEXTJOIN (and where & still wins)

  • & is the simplest for 2–3 pieces. Fast to type, easy to read.
  • CONCAT is modern and handles ranges, but no delimiter logic.
  • TEXTJOIN is best when you need delimiters, want to ignore blanks, or join many pieces at once.

My rule:

  • Short message → & or CONCAT
  • Long/variable list → TEXTJOIN

Helper Columns: Clean Structure = Fewer Bugs

For production workbooks and dashboards:

  1. Raw/Numeric column (e.g., DecimalAchievement)
  2. Display column (e.g., Message with TEXT())
  3. Optional Status column

This separation keeps your calculations reliable and your presentation polished and makes auditing easier.

Dynamic Ranges vs Full Column References

If your table has nothing below it, it can be convenient to use full column references (B:B, C:C) in TEXTJOIN. It’s quick and you never worry about missing new rows. However:

  • Full columns can be slower on massive sheets.
  • In structured tables (Ctrl+T), prefer structured references (faster, clearer):

=TEXTJOIN(CHAR(10), TRUE,

  Table1[Employee] & “: ” & TEXT(Table1[Achievement], “0.0%”)

)

Google Sheets Equivalent

Everything here works in Google Sheets too. TEXT() has the same signature and percent formats:

Read also:  Advanced COUNTIFS Functions in Excel: A Comprehensive Guide

=A2 & ” met the target with ” & TEXT(B2, “0.0%”)

TEXTJOIN, IF, and LET work similarly (Sheets has LET now as well).

Frequently Asked Questions

Q1: My input is already 87.2 (not 0.872). What should I do?

Use /100 to convert:

=CONCAT(A2, ” met the target with “, TEXT(B2/100, “0.0%”))

Q2: Can I control negative percentages formatting?

Yes. Use a custom format with sections:

TEXT(B2, “0.0%;-0.0%;””0.0%”””)

(Positive;Negative;Zero). You can even add color, but colors in TEXT’s format string won’t render as colored text, only as literal text. For colored presentation, use conditional formatting on the cell.

Q3: Why do I get #VALUE! sometimes?

TEXT() errors out if the value is non-numeric. Wrap it:

=IFERROR(CONCAT(A2, ” met the target with “, TEXT(B2, “0.0%”)), “”)

Q4: Can I force a specific decimal separator?

TEXT() follows your Excel locale. To export a different locale, consider Power Query or TEXT with careful post-processing. For cross-locale files, keep a numeric column and format at the destination.

Q5: Will TEXT() slow down my workbook?

It’s lightweight. Problems arise only with huge ranges and repeated TEXTJOIN over full columns. Use tables and targeted ranges for scale.

Copy-Paste Recipes (ready for your sheet)

Basic sentence

=A2 & ” met the target with ” & TEXT(B2, “0.0%”)

Exceeded vs achieved

=IF(B2>=1,

   A2 & ” exceeded the target with ” & TEXT(B2, “0.0%”),

   A2 & ” achieved ” & TEXT(B2, “0.0%”) & ” of the target”

)

Batch summary (line breaks)

=TEXTJOIN(CHAR(10), TRUE, A2:B10 & “: ” & TEXT(B2:C10, “0.0%”))

Status label + percent (clean LET)

=LET(n,A2,p,B2,s,IF(p>=1,”Exceeded”,IF(p>=0.9,”Near target”,”Below target”)),

     s & ” — ” & n & ” at ” & TEXT(p, “0.0%”))

Final Checklist (use this before you publish/send)

  • Keep a numeric source column for math
  • Use TEXT() only for the message column
  • Standardize decimal places (e.g., “0.0%”)
  • Handle blanks/errors with IFERROR or IF
  • Sort and filter using the numeric column
  • Use TEXTJOIN for neat, multi-line summaries
  • Use structured references in Tables for clarity

Wrap-Up

Numbers are for models. Sentences are for people.
With TEXT(), you can transform raw decimals into crystal-clear messages that your audience will understand instantly, whether it’s a dashboard, a status report, or an automated email.

If you found this useful, share it with a colleague who still writes “0.872” in updates 😉 . And if you want the template workbook for this article, tell me, I’ll add a downloadable example to ExcelBell.

Happy reporting!

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top