0

var data = "عينات";

var num = "123";

var res = data + num; // returns عينات123

I am trying to concatenate numbers to the right side of the arabic text, but its jumping to the left side, also tried reversing the string, but didn't help.

Please suggest a solution in Javascript.

Thanks in Advance!

The fourth bird
  • 154,723
  • 16
  • 55
  • 70
Siva
  • 43
  • 5

2 Answers2

2

You can make use of Directional_Formatting_Codes:

  • LRE U+202A LEFT-TO-RIGHT EMBEDDING Treat the following text as embedded left-to-right.
  • PDF U+202C POP DIRECTIONAL FORMATTING End the scope of the last LRE, RLE, RLO, or LRO.

var data = "عينات";
var num = "123";
var res = "\u202A" + data + "\u202C" + num
console.log(res);
The fourth bird
  • 154,723
  • 16
  • 55
  • 70
  • @Siva it is better to avoid the LTR/RTL codes because these become part of the text. So if you do s search for (or split) a particular word/text in the original text you need to also consider these codes. If you copy the output text; some editor/word processors will show these codes as small dots. Try to copy the output text to the VScode editor and you will see the codes embedded in between the characters. – Mohsen Alyafei Jan 07 '22 at 06:51
0

Another answer suggested adding control characters into the text, but as someone commented this approach has it's downsides.

The reason you get the digits to the left no matter the order of the string is because you are using an LTR element (or the browser's console which is always LTR). Then if the digits come first they start at the left, and if the arabic letters come first they start at the right because arabic letters have "hard" RTL directionning even inside an LTR element.

However, if you are using an RTL element and put the digits first, it will show up as intended:

<div dir="rtl">123عينات</div>

Or dynamically with JavaScript:

var data = "عينات";
var num = "123";
var res = num + data;

var el = document.createElement('div');
el.dir = "rtl";
el.textContent = res;
document.body.append(el);
Noam
  • 1,317
  • 5
  • 16