
🔢 Talloversettelse med PHP og JavaScript: Arabiske tall til devanagari og tilbake
En bruker fyller ut et skjema på et nettsted, og tallene blir til uleselige tegn. Dette er en kjent situasjon for alle som jobber med flerspråklige prosjekter: den nepalske versjonen av en nettbutikk viser priser i अक्षर, og kontaktskjemaet feiler validering på grunn av «feil» sifre.
Problemet er at ulike språk bruker ulike tallsystemer. Engelsk og russisk bruker arabiske tall (0-9). Hindi, nepali og marathi bruker devanagari-symboler (०-९). PHP og JavaScript bytter ikke mellom dem ut av esken. Likevel kan oppgaven løses uten et eneste eksternt bibliotek, kun ved hjelp av innebygde strengfunksjoner. Ingen avhengigheter å installere, ingen tredjeparts API-er.
Nedenfor finner du to klare til bruk kodebiter som løser dette problemet på 5 minutter. Ingen rammeverk, ingen Composer-pakker, ingen npm-avhengigheter, bare ren PHP og vanilla JavaScript. Kopier dem, bytt ut symbolene dine, så fungerer det.
💡 Rask oversikt:
- Kopier PHP-funksjonen inn i temaets functions.php eller via Code Snippets-utvidelsen; den konverterer arabiske tall til devanagari og tilbake
- For frontend bruker du den ferdige JavaScript-koden med ordbokobjekter for konvertering i sanntid rett i inntastingsfeltet
- Erstatningen bruker en glyfkorrespondansetabell snarere enn matematikk, noe som gjør metoden universell for ethvert skriftsystem
- Test det: send inn 1234 og få १२३४, og omvendt; begge retninger fungerer symmetrisk
Slik fungerer tallsystemer i ulike språk
De fleste nettsteder jobber med arabiske tall: 0 1 2 3 4 5 6 7 8 9. Historisk sett kom dette systemet fra India, men ble utbredt via den arabiske verden, derav navnet.
Alternative sett finnes i dusinvis av skriftsystemer. Devanagari (hindi, nepali, marathi) bruker sin egen serie: ० १ २ ३ ४ ५ ६ ७ ८ ९. Øst-arabiske tall (arabisk, persisk, urdu) bruker et annet sett: ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩. Bengalsk, thai og khmer har hver sine glyfer og sine egne Unicode-områder. Det finnes mer enn tjue slike systemer totalt.
Men den numeriske verdien forblir den samme. 5, ५ og ٥ er alle det samme tallet «fem», bare skrevet med ulike symboler. Derfor er oversettelse mellom systemer glyferstatning ved hjelp av en korrespondansetabell, ikke matematisk konvertering. Det er ingenting å regne om; du trenger bare å kjenne de riktige symbolparene.
Dette er nøyaktig prinsippet bak koden nedenfor.
Trinn 1: Konvertering av tall med PHP

PHP-tilnærmingen er så enkel som det går an: funksjonen str_replace() tar to matriser, hva som skal finnes og hva som skal erstattes med. Strengen behandles i én enkelt gjennomkjøring, og alle treff erstattes.
Legg til denne koden i barnetemaets functions.php eller via Code Snippets-utvidelsen. Funksjonen aksepterer et tall eller en streng som inneholder sifre og returnerer resultatet med devanagari-symboler.
1 <?php 2 /** 3 * Converts Arabic numerals to Devanagari characters (Hindi, Nepali). 4 * 5 * @param string|int $input String or number to convert. 6 * @return string String with Devanagari numerals. 7 */ 8 function convert_to_devanagari($input) { 9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९"); 11 12 return str_replace($english, $devanagari, (string) $input); 13 } 14 15 /* Usage example */ 16 echo convert_to_devanagari(2026); 17 // Output: २०२६ 18 ?>
Det som skjer her: str_replace() itererer gjennom $english-matrisen, og for hvert element (for eksempel "2") erstatter det tilsvarende element fra $devanagari ("२"). Konvertering til (string) sikrer at funksjonen fungerer med både tall og strenger.
Omvendt konvertering, fra devanagari til arabiske tall, gjøres ved å bytte om matrisene:
1 <?php 2 /** 3 * Converts Devanagari characters back to Arabic numerals. 4 * 5 * @param string $input String with Devanagari numerals. 6 * @return string String with Arabic numerals. 7 */ 8 function convert_from_devanagari($input) { 9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९"); 11 12 return str_replace($devanagari, $english, $input); 13 } 14 15 /* Example */ 16 echo convert_from_devanagari('२०२६'); 17 // Output: 2026 18 ?>
Matrisene er de samme; bare rekkefølgen på argumentene endres. Den første matrisen inneholder nå devanagari-symboler (det vi søker etter), den andre inneholder arabiske tall (det vi erstatter med).
Hvor det brukes. Funksjonen er nyttig overalt i temaet der tall vises: produktpriser i WooCommerce, datoer i blogginnlegg, sidenummerering. Pakk inn kallet der du trenger siffer-lokalisering for et spesifikt publikum.
Håndtering av grensetilfeller i PHP
Funksjonen convert_to_devanagari() aksepterer string|int, men i praksis kan input være hva som helst. Hva skjer hvis du sender inn null, en tom streng eller en streng uten sifre? (string) null returnerer en tom streng, og str_replace() med en tom streng returnerer også tomt uten feil. En streng uten sifre (for eksempel "Hello") returneres uendret siden erstatningen ikke finner noen treff.
Hvis tallet inneholder skilletegn (komma for tusener, punktum for desimaler), forblir de på plass; bare selve sifrene erstattes. For flyttall er denne oppførselen korrekt, men hvis tallformatering er viktig og skilletegn bør endres i henhold til lokaliteten, legg til separat behandling via number_format() før konvertering.
For svært lange tall (for eksempel 20-sifrede identifikatorer) fungerer tilnærmingen uten endringer: str_replace() behandler strenger av hvilken som helst lengde, kun begrenset av tilgjengelig PHP-minne. Devanagari-tegn tar 3 byte hver i UTF-8, så den resulterende strengen vil være lengre enn originalen i byte. For tegntelling, bruk mb_strlen(), ikke strlen().
Trinn 2: Konvertering av tall med JavaScript
På frontend implementeres den samme logikken ved hjelp av ordbokobjekter og metoden String.replace() med et regulært uttrykk. Dette er praktisk for dynamiske grensesnitt: brukeren taster inn et tall i et felt, og skriptet viser umiddelbart devanagari-ekvivalenten.
Plasser denne koden i en separat .js-fil i temaet ditt eller via wp_add_inline_script i functions.php. Ingen avhengigheter, ren ES5, fungerer selv i gamle nettlesere.
1 /** 2 * Dictionaries for translating between Arabic numerals and Devanagari. 3 */ 4 var englishToDevanagari = { 5 '0': '०', '1': '१', '2': '२', '3': '३', '4': '४', 6 '5': '५', '6': '६', '7': '७', '8': '८', '9': '९' 7 }; 8 9 var devanagariToEnglish = { 10 '०': '0', '१': '1', '२': '2', '३': '3', '४': '4', 11 '५': '5', '६': '6', '७': '7', '८': '8', '९': '9' 12 }; 13 14 /** 15 * Converts Arabic numerals in a string to Devanagari characters. 16 * @param {string|number} input 17 * @returns {string} 18 */ 19 function toDevanagari(input) { 20 return String(input).replace(/[0-9]/g, function(match) { 21 return englishToDevanagari[match]; 22 }); 23 } 24 25 /** 26 * Converts Devanagari characters to Arabic numerals. 27 * @param {string} input 28 * @returns {string} 29 */ 30 function fromDevanagari(input) { 31 return input.replace(/[०-९]/g, function(match) { 32 return devanagariToEnglish[match]; 33 }); 34 } 35 36 // Examples: 37 console.log(toDevanagari(9857)); // ९८५७ 38 console.log(fromDevanagari('१२३४')); // 1234
Nøkkelpunktet er det regulære uttrykket /[0-9]/g. Flagget g (global) får replace() til å behandle hvert siffer i strengen, ikke bare det første. Den anonyme callback-funksjonen mottar det matchede tegnet og returnerer dets ekvivalent fra ordboken.
For devanagari-sifre brukes området [०-९]; i Unicode er disse tegnene sekvensielle, så regex fungerer korrekt.
Hvor det brukes. Direkte input i skjemaer (konvertering i sanntid mens man skriver), visning av priser og datoer i lokaliserte versjoner av nettstedet, omvendt konvertering før skjemaet sendes til serveren slik at arabiske tall alltid går til databasen.
Praktisk eksempel: kontaktskjema med sanntidskonvertering
La oss kombinere begge tilnærmingene til et fungerende oppsett. Anta at den nepalske versjonen av et nettsted har et bestillingsskjema der brukeren taster inn et beløp i devanagari. Oppgaven: vis det inntastede tallet i begge systemer for verifisering og send arabiske tall til serveren.
Skjemamarkeringen inneholder en <input> og en forhåndsvisningsblokk. Ved hvert tastetrykk i feltet utløses input-hendelsesbehandleren, som kaller toDevanagari() og viser resultatet i en tilstøtende <span>. Når skjemaet sendes inn, utløses fromDevanagari(), og POST-forespørselen som sendes til serveren inneholder arabiske tall. PHP-serverkoden mottar tallet i standardformat og jobber med det som vanlig, uten ytterligere konvertering.
Dette samme mønsteret gjelder for prisfelt, datoer, telefonnumre og alle andre felt der brukeren forventer å se sitt eget tallsystem, mens systemet trenger å lagre et enhetlig format. Konvertering tar mikrosekunder og påvirker ikke grensesnittets responsivitet.
Se også: video om tallsystemer i programmering
For en bredere titt på temaet hvordan tallsystemer fungerer i kode og hvordan man konverterer mellom dem i JavaScript, se denne gjennomgangen av Techno Geek. Den dekker binære, oktale og desimale systemer med et ferdig prosjekt.
⁉️🤔 Ofte stilte spørsmål
Kan denne samme metoden konvertere sifre til arabisk (øst-arabiske symboler)?
Ja. Erstatt devanagari-matrisen med øst-arabiske symboler:
array("٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"). Logikken er den samme:str_replace()i PHP og en ordbok med regex i JS. Den tilpasser seg like enkelt til bengalsk, thai, khmer og ethvert annet skriftsystem med egne numeriske glyfer.
Er det trygt å bruke str_replace() for multibyte-strenger i PHP?
Ja,
str_replace()fungerer korrekt med UTF-8 og multibyte-tegn, i motsetning tilstrpos()ellersubstr()som trenger mbstring-ekvivalenter. Devanagari-symboler (२,३) tar 3 byte hver i UTF-8, menstr_replace()håndterer dem på en byte-sikker måte fordi den søker etter eksakte binære sekvenstreff. Det vil ikke oppstå problemer.
Hva hvis strengen inneholder en blanding av arabiske tall og devanagari-symboler?
Begge funksjonene behandler kun sine respektive områder. Hvis
convert_to_devanagari()mottar strengen"Price: 500 रुपय", blir tallet500til५००mens teksten forblir urørt. Den omvendte funksjonenconvert_from_devanagari()påvirker bare devanagari-sifre. Blandet input håndteres korrekt automatisk.
Hvordan kan jeg bruke konvertering på alle tall på en WordPress-side uten å redigere hver mal?
Bruk JavaScript-tilnærmingen fra trinn 2 og kjør en DOM-nodegjennomgang ved sidelasting. Finn alle tekstnoder som inneholder sifre (via
TreeWalkereller rekursivchildNodes-gjennomgang) og bruktoDevanagari()på innholdet deres. For PHP-tilnærmingen på serversiden, bruk et filter påthe_contentellergettexthvis tall er innebygd i oversettelser.
Hvor kan jeg finne tegntabeller for andre skriftsystemer?
Den autoritative kilden er Unicode Consortium. For devanagari-sifre er dette området U+0966-U+096F. Øst-arabisk er U+0660-U+0669. Bengalsk er U+09E6-U+09EF. Bare kopier tegnene fra tabellen og sett dem inn i matrisene; koden trenger ikke å endres.
Ytelse og begrensninger ved tilnærmingen
str_replace() med matriser på 10 elementer utfører nøyaktig 10 sammenligninger for hver posisjon i strengen. For en typisk streng med 5-10 sifre betyr dette 50-100 operasjoner; utførelsestiden måles i mikrosekunder. Til sammenligning legger tilnærmingen med preg_replace_callback() og et regulært uttrykk til overhead for mønsterkompilering og callback-påkalling for hvert treff. Forskjellen er umerkelig for små strenger, men str_replace() vinner på store volumer.
Hovedbegrensningen ved tilnærmingen er at den erstatter glyfer, ikke tallenes semantikk. Hvis du trenger aritmetikk på devanagari-tall (addisjon, multiplikasjon), vil ikke devanagari-symboler bli gjenkjent som tall av PHP. Konverter alltid til arabiske tall før matematiske operasjoner og konverter tilbake etterpå. Dette er ikke en feil ved metoden, men en konsekvens av forskjellen mellom skriftsystemer og numeriske datatyper.
En annen nyanse: metoden forutsetter en en-til-en-korrespondanse av «én glyf, ett siffer». For skriftsystemer der tall skrives med sammensatte ligaturer (som i noen historiske systemer), vil den enkle erstatningstilnærmingen ikke fungere. Men for alle moderne indiske skrifter (devanagari, bengalsk, gurmukhi, gujarati, odia, tamil, telugu, kannada, malayalam), så vel som for øst-arabiske tall, er korrespondansen strengt 1 til 1, og metoden fungerer feilfritt.
Hva bør deployes til produksjon: PHP, JavaScript eller begge?
PHP-løsningen er for tilfeller der tall må gjengis i målsymbolsystemet på serveren før HTML-en sendes. Dette er riktig for SEO: søkemotoren ser innholdet umiddelbart i mållokaliteten, ikke arabiske tall som deretter erstattes av et skript. For en WooCommerce-butikk betyr dette at katalog- og produktsidepriser indekseres med devanagari-sifre, noe som positivt påvirker rangering i de nepalske og hindiske segmentene.
JavaScript-varianten er for dynamisk interaksjon: et inntastingsfelt med umiddelbar forhåndsvisning, språkbytte uten sidelasting, konvertering av skjemadata før innsending. Den er også uunnværlig for enkeltsideapplikasjoner (SPA) der serveren returnerer JSON med arabiske tall og frontend gjengir dem i brukerens lokalitet.
I praksis fungerer en kombinasjon godt: PHP gjengir siden med lokaliserte sifre for indeksering, mens JavaScript håndterer brukerinput og konverterer frem og tilbake i sanntid. Begge kodebitene, uten eksterne avhengigheter, er færre enn 40 linjer til sammen, og de løser oppgaven fullstendig for ethvert skriftsystem med egne numeriske glyfer.
Før du deployer til produksjon, test tre scenarier: et direkte funksjonskall med et tall, en streng med blandet innhold (sifre pluss tekst) og omvendt konvertering. Sørg for at arabiske tall alltid når serveren, og at grensesnittet viser brukeren systemet som samsvarer med deres språkforventninger. Fem minutters testing sparer timer med feilsøking på live trafikk.
Kopier begge kodebitene inn i prosjektet ditt, bytt ut de nødvendige symbolene fra Unicode-tabellen for ditt skriftsystem, så er oppgaven løst. Alt du trenger er allerede innebygd i språket.



