Duodecimal converter
144 in decimal is 100 in base 12, because it is exactly twelve dozens: convert whole numbers to dozenal digits, with X for ten and E for eleven, or decode them back. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Value
- 144
- Conversion direction
- To duodecimal
- Result
- 100
- Decimal
- 144
- Duodecimal
- 100
- Alphabet
- 0123456789XE
A duodecimal converter rewrites a non-negative whole number between everyday base-10 and base-12, the dozenal system that groups by twelves instead of tens. The twelve digits are zero through nine, then dek (written X) for ten and el (written E) for eleven—the classic dozenal symbols used by educators, hobbyist number-system authors, and anyone who wants a clear label for the two extra place values. You choose a direction—decimal to duodecimal or duodecimal back to decimal—enter the value, and receive a deterministic result with the cleaned decimal integer, the base-12 string, the digit count, and explicit dek and el markers. Any character outside the alphabet fails with a clear invalid-input error instead of a silent wrong answer.
How duodecimal (base-12) encoding and decoding work
Duodecimal is positional notation with radix twelve. Each place is a power of twelve, just as decimal places are powers of ten: the units place is twelve to the zero, the next place is twelve, then one hundred forty-four, then one thousand seven hundred twenty-eight, and so on. The twelve digit symbols used here are zero through nine for values zero through nine, the letter X for dek (ten), and the letter E for el (eleven).
That dek-and-el alphabet matches common dozenal teaching materials and keeps the two extra digits visually distinct from ordinary hexadecimal A and B while still staying inside plain ASCII. To encode a non-negative decimal integer, divide repeatedly by twelve and record each remainder as the next least-significant digit; reverse those remainders to obtain the usual left-to-right string without leading zeros except for the number zero itself.
To decode, walk the string from left to right, multiply the running total by twelve, and add the digit value of the next character—the classic Horner scheme. An invalid character such as a space, plus sign, G, or punctuation mark aborts with invalid input naming the bad character and its position. Values must stay inside JavaScript’s safe integer range so every digit remains exact when the result is serialized.
Negative inputs are rejected on purpose; the duodecimal alphabet has no sign digit, and signed dozenal is a separate convention. If you need arbitrary bases from two through thirty-six without dedicated dek and el symbols, that is a different search intent served by a general radix converter rather than this duodecimal-specific landing.
Where duodecimal converters show up in real work
Mathematics education and history-of-numeration courses introduce base twelve because it divides evenly by two, three, four, and six, making many fractions terminate more cleanly than in decimal. Dozenal advocacy groups, recreational mathematicians, and puzzle authors publish tables that mix ordinary digits with dek and el, and they need a shared oracle that treats X as ten and E as eleven rather than as hex A and B alone.
Game designers and world-builders invent dozenal calendars, inventories of twelve, or alien numbering systems and need deterministic conversion for lore tools and save formats. Treat general multi-base radix tables that stop at thirty-six with A through Z, pure hexadecimal dumps, binary-only converters, and Base64 byte encoding as separate search intents with their own landings rather than stretching this integer duodecimal converter past its honest scope.
What you can do with it
Classroom dozenal place-value drills
Convert homework integers between base-10 and base-12 with explicit dek (X) and el (E) so answer keys match textbook dozenal notation.
Game and world-building number systems
Map inventory counts and calendar values into base-12 strings for dozenal-themed games and lore tools without hand-encoding digits.
FAQ
What alphabet does this duodecimal converter use?
The twelve characters 0-9, then X for dek (10) and E for el (11). Output always uses uppercase X and E.
What happens on an invalid duodecimal digit?
The message names the bad character and its position. Only 0-9, X/x or A/a (dek), and E/e or B/b (el) are allowed; spaces, punctuation, and other letters are rejected.
Is this the same as a general radix converter or hexadecimal?
No. General radix tools typically use A–Z for digits ten and up and stop at base 36. Hexadecimal is base 16 with A–F. This page is dedicated to base-12 with the dozenal dek (X) and el (E) symbols.
What does it cost?
The browser tool is free and runs locally.
What is 144 in base 12?
144 is 100 in base 12, because twelve twelves make 144 and the 1 sits in that place. Likewise, 10 becomes X and 11 becomes E, the two extra dozenal digits.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fmt/duodecimal \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"value":"144","direction":"to_duodecimal"}'const res = await fetch("https://api.kit.forhosting.com/fmt/duodecimal", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"value": "144",
"direction": "to_duodecimal"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fmt/duodecimal",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"value": "144",
"direction": "to_duodecimal"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fmt/duodecimal", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"value":"144","direction":"to_duodecimal"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"value":"144","direction":"to_duodecimal"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fmt/duodecimal", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"value": "144",
"direction": "to_duodecimal"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fmt.duodecimal",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_abs | 9007199254740991 |
max_duodecimal_chars | 14 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Pricing for successful API calls is the published base of $0.002 per item.
How duodecimal (base-12) encoding and decoding work
Input is case-insensitive for the letter digits: x and e map to dek and el the same way X and E do, and A or B are accepted as friendly aliases for people who habitually type hex-style letters. The algorithm uses exact integer arithmetic only: no floating-point rounding, no random seeds, no wall-clock timestamps, and no network calls, so identical inputs always produce identical JSON.
What you send and what you get back
Send two required fields: value and direction. Absolute decimal values larger than Number.MAX_SAFE_INTEGER are rejected so low-order digits cannot silently disappear. Classic checks include one hundred forty-four encoding to one hundred in base twelve, ten encoding to X, eleven encoding to E, and decoding one-E back to twenty-three. Direction must be to_duodecimal when value is a non-negative decimal integer, or from_duodecimal when value is a base-12 string. Aliases are accepted so forms and scripts can use the names that fit their UI: value also accepts n, number, input, text, decimal, duodecimal, and dozenal; direction also accepts dir, mode, and op, plus short synonyms such as to, from, encode, decode, to_dozenal, from_dozenal, to_base12, and from_base12. For to_duodecimal, value may be a JSON integer or a digit string with an optional leading plus; fractions, scientific notation, bare words, NaN, Infinity, and negatives fail with invalid_input and are not charged. For from_duodecimal, every character must belong to the alphabet zero-nine plus X or E (or the lowercase and A/B aliases); any other character—including underscore, hyphen, and space—fails with a message that names the invalid duodecimal digit. On success the response echoes the cleaned value string, the normalized direction, decimal as a number, duodecimal as the compact base-12 string with uppercase X and E, result as the primary converted form (duodecimal when encoding, decimal string when decoding), the full alphabet string, base set to twelve, digit_count for the duodecimal representation, and the literal markers dek equals X and el equals E. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Where duodecimal converters show up in real work
Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Integration use cases
Dozenal tables and puzzle fixtures
Generate deterministic decimal ↔ duodecimal pairs for recreational math tables, puzzle keys, and unit-test goldens.
Technical questions
How do I choose the direction?
Use to_duodecimal when value is a non-negative decimal integer and you want a base-12 string. Use from_duodecimal when value is already duodecimal and you want the decimal integer back.