Skip to content

Instantly share code, notes, and snippets.

@frdnrdb
Last active November 11, 2022 00:41
Show Gist options
  • Save frdnrdb/c8f3d179d7bcfede5d2e9d4b9358dbdb to your computer and use it in GitHub Desktop.
Save frdnrdb/c8f3d179d7bcfede5d2e9d4b9358dbdb to your computer and use it in GitHub Desktop.
norwegian: numbers to words/ number spelling
// source: https://no.wikipedia.org/wiki/Tall
const numbers = ['','en','to','tre','fire','fem','seks','sju','åtte','ni','ti','elleve','tolv','tretten','fjorten','femten','seksten','søtten','atten','nitten'];
const tens = ['','','tjue','tretti','førti','femti','seksti','søtti','åtti','nitti'];
const units = [ '', '', 'hundre', 'tusen', 'million', 'milliard', 'billion', 'billiard', 'trillion', 'trilliard', 'kvadrillion', 'kvadrilliard', 'kvintillion', 'kvintilliard', 'sekstillion', 'sekstilliard', 'septillion', 'septilliard', 'oktillion', 'oktilliard', 'nonillion', 'nonilliard', 'desillion', 'undesillion', 'dodesillion', 'tredesillion', 'quattordesillion', 'kvindesillion', 'seksdesillion', 'googol', 'septendesillion', 'oktoesillion', 'novemdesillion', 'vigintillon', 'unvigintillion', 'dovigintillion', 'trevigintillion', 'kvartvigintillion', 'kvintvigintillion', 'seksvigintillion', 'septenvigintillion', 'octovigintillion', 'novemvigintillion', 'trigintillion', 'untrigintillion', 'dotrigintillion', 'trerigintillion', 'dogoogol', 'centillion'];
const zeros = [0, 1, 2, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 66, 72, 78, 84, 90, 96, 100, 102, 108, 114, 120, 126, 132, 138, 144, 150, 156, 162, 168, 174, 180, 186, 192, 198, 200, 600, 1200];
const variant = (w, index) => w === 'en' && index < 4 ? 'ett' : w;
const plural = (w, index) => w === 'en' || index < 4 ? '' : 'er';
const mark = (w, index) => index > 3 ? `<mark>${w}</mark>` : w;
export default function toWords(n) {
// remove leading zeros and non numerical characters
n = n.toString().replace(/[^0-9]/g, '').replace(/^0+/, '');
if (!n.length || n.length > zeros.at(-1)) return '';
if (!Number(n)) return 'null';
if (n < 20) return numbers[n];
if (n < 100) return tens[Math.floor(n / 10)] + numbers[n % 10];
const length = n.length;
const index = zeros.findIndex(n => n > length - 1) - 1;
const unit = units[index];
const zero = zeros[index];
const [ major, minor ] = [
n.substring(0, length - zero),
n.substring(length - zero)
].map(toWords);
return variant(major, index) + ' ' + mark(unit + plural(major, index), index) + (index === 2 && minor ? ' og ' : ' ') + (minor || '');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment