丸数字を数字に変換して返す関数
文字コードを使ってスマートに書けないかな?と思って調べたけど、丸数字は番号が連続してなかったので、ベタに丸数字の配列を持ったほうがシンプルという結論に。
const roundNums =
'①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿'.split('')
const roundNumReg = new RegExp(roundNums.join('|'), 'g')
/**
* 丸数字を数字に変換して返す
* @param tgtStr 変換元の文字列
* @param [replaceFunc] 変換後の数字に対して変換処理をかけて返す関数
* @returns
*/
export const roundNumToNum = ({
tgtStr,
replaceFunc,
}: {
tgtStr: string
replaceFunc?: (num: number) => string
}) => {
return tgtStr.replace(roundNumReg, (match: string) => {
const replaced = roundNums.indexOf(match)
return replaced > -1 ? (replaceFunc ? replaceFunc(replaced + 1) : String(replaced + 1)) : ''
})
}
呼び出し側
roundNumToNum({ tgtStr: '①②あああ③④' }))
// 12あああ34
roundNumToNum({
tgtStr: '①②あああ③④',
replaceFunc: (num: number) => '<span>' + num + '</span>',
})
// <span>1</span><span>2</span>あああ<span>3</span><span>4</span>
以下は、結局調べたけど使わなかった。
丸数字のunicodeを把握
'①'.charCodeAt(0).toString(16) // 2460
unicodeを使った正規表現
'①'.match(/\u{2460}/u)
// ['①', index: 0, input: '①', groups: undefined]