Skip to content

Instantly share code, notes, and snippets.

@axjack
Created February 20, 2020 15:03
Show Gist options
  • Save axjack/206e52a36bc16bc2f593ddc056e5b71f to your computer and use it in GitHub Desktop.
Save axjack/206e52a36bc16bc2f593ddc056e5b71f to your computer and use it in GitHub Desktop.
ハイフンなしの電話番号をハイフンありでフォーマットする
/*
ハイフンなしの電話番号をハイフンありでフォーマットする
thanks to : https://qiita.com/kennyj@github/items/dde3880abb5071f649ab
*/
//S: 電話番号接頭辞集合
let S = ['03', '04', '06', '050', '070', '080', '090', '020', '011', '015', '017', '018', '019', '022', '023', '024', '025', '026', '027', '028', '029', '042', '043', '044', '045', '046', '047', '048', '049', '052', '053', '054', '055', '058', '059', '072', '073', '075', '076', '077', '078', '079', '082', '083', '084', '086', '087', '088', '089', '092', '093', '095', '096', '097', '098', '099', '0120', '0800', '0570', '0990', '0123', '0124', '0125', '0126', '0133', '0134', '0135', '0136', '0137', '0138', '0139', '0142', '0143', '0144', '0145', '0146', '0152', '0153', '0154', '0155', '0156', '0157', '0158', '0162', '0163', '0164', '0165', '0166', '0167', '0172', '0173', '0174', '0175', '0176', '0178', '0179', '0182', '0183', '0184', '0185', '0186', '0187', '0191', '0192', '0193', '0194', '0195', '0197', '0198', '0220', '0223', '0224', '0225', '0226', '0228', '0229', '0233', '0234', '0235', '0237', '0238', '0240', '0241', '0242', '0243', '0244', '0246', '0247', '0248', '0250', '0254', '0255', '0256', '0257', '0258', '0259', '0260', '0261', '0263', '0264', '0265', '0266', '0267', '0268', '0269', '0270', '0274', '0276', '0277', '0278', '0279', '0280', '0282', '0283', '0284', '0285', '0287', '0288', '0289', '0291', '0293', '0294', '0295', '0296', '0297', '0299', '0422', '0428', '0436', '0438', '0439', '0460', '0463', '0465', '0466', '0467', '0470', '0475', '0476', '0478', '0479', '0480', '0493', '0494', '0495', '0531', '0532', '0533', '0536', '0537', '0538', '0539', '0544', '0545', '0547', '0548', '0550', '0551', '0553', '0554', '0555', '0556', '0557', '0558', '0561', '0562', '0563', '0564', '0565', '0566', '0567', '0568', '0569', '0572', '0573', '0574', '0575', '0576', '0577', '0578', '0581', '0584', '0585', '0586', '0587', '0594', '0595', '0596', '0597', '0598', '0599', '0721', '0725', '0735', '0736', '0737', '0738', '0739', '0740', '0742', '0743', '0744', '0745', '0746', '0747', '0748', '0749', '0761', '0763', '0765', '0766', '0767', '0768', '0770', '0771', '0772', '0773', '0774', '0776', '0778', '0779', '0790', '0791', '0794', '0795', '0796', '0797', '0798', '0799', '0820', '0823', '0824', '0826', '0827', '0829', '0833', '0834', '0835', '0836', '0837', '0838', '0845', '0846', '0847', '0848', '0852', '0853', '0854', '0855', '0856', '0857', '0858', '0859', '0863', '0865', '0866', '0867', '0868', '0869', '0875', '0877', '0879', '0880', '0883', '0884', '0885', '0887', '0889', '0892', '0893', '0894', '0895', '0896', '0897', '0898', '0920', '0930', '0940', '0942', '0943', '0944', '0946', '0947', '0948', '0949', '0950', '0952', '0954', '0955', '0956', '0957', '0959', '0964', '0965', '0966', '0967', '0968', '0969', '0972', '0973', '0974', '0977', '0978', '0979', '0980', '0982', '0983', '0984', '0985', '0986', '0987', '0993', '0994', '0995', '0996', '0997', '01267', '01372', '01374', '01377', '01392', '01397', '01398', '01456', '01457', '01466', '01547', '01558', '01564', '01586', '01587', '01632', '01634', '01635', '01648', '01654', '01655', '01656', '01658', '04992', '04994', '04996', '04998', '05769', '05979', '07468', '08387', '08388', '08396', '08477', '08512', '08514', '09496', '09802', '09912', '09913', '09969'];
/**
* hostへ文字列を出力する関数
* @param {string} str
* @example
* disp("Hello, World!")
*/
function disp(str) {
//console.log(str);
display.log(str);
}
/**
* 指定した3桁の数字区切りで電話番号をハイフンフォーマットする関数
* @param {string} telnum - ハイフンなしの電話番号
* @param {string} fmt - フォーマット用の3桁の数値
* @return {string} ハイフン付きでフォーマットされた電話番号
* @example
* let tel_formtd = FormatTelnum("0120112222","424")
* // tel_formtd = "0120-11-2222"
*/
function FormatTelnum(telnum, fmt) {
let fmt0 = fmt[0] - 0;
let fmt1 = fmt[1] - 0;
let fmt2 = fmt[2] - 0;
let t1 = telnum.substring(0, fmt0);
let t2 = telnum.substring(fmt0, fmt0 + fmt1);
let t3 = telnum.substring(fmt0 + fmt1);
let output = t1 + "-" + t2 + "-" + t3;
return output;
}
/**
* 電話番号接頭辞集合Sに電話番号telnumが含まれているか調べる関数
* @param {string} telnum - ハイフンなしの電話番号
* @return {string} 電話番号接頭辞もしくは"notfound"を返す
*/
function FindTelnumPrefix(telnum) {
let prefix_ = "notfound";
for (let i = 0; i < S.length; i++) {
if (S[i] === telnum.substring(0, S[i].length)) {
prefix_ = S[i];
}
}
return prefix_;
}
//例
//電話番号
let t = "0120333906";
main(t);
function main(t) {
if (t.length < 10) {
disp(t)
} else {
let prefix = FindTelnumPrefix(t);
if (prefix == "notfound") {
switch (t.length) {
case 11:
disp(FormatTelnum(t, "344"));
break;
case 10:
disp(FormatTelnum(t, "334"));
break;
default:
disp(t);
break;
}
} else {
if ((prefix == "0120") || (prefix == "0570")) {
disp(FormatTelnum(t, "433"));
} else {
switch (prefix.length) {
case 2:
disp(FormatTelnum(t, "244"));
break;
case 3:
disp(FormatTelnum(t, "334"));
break;
case 4:
disp(FormatTelnum(t, "424"));
break;
case 5:
disp(FormatTelnum(t, "514"));
break;
}
}
}
}
}
@axjack
Copy link
Author

axjack commented Feb 21, 2020

vbscript版を作成した。

' ----------
' ハイフンなしの電話番号をハイフンありでフォーマットする
'   thanks to : https://qiita.com/kennyj@github/items/dde3880abb5071f649ab
' ----------

' S: 電話番号接頭辞集合
Dim S
S = Array("03", "04", "06", "050", "070", "080", "090", "020", "011", "015", "017", "018", "019", "022", "023", "024", "025", "026", "027", "028", "029", "042", "043", "044", "045", "046", "047", "048", "049", "052", "053", "054", "055", "058", "059", "072", "073", "075", "076", "077", "078", "079", "082", "083", "084", "086", "087", "088", "089", "092", "093", "095", "096", "097", "098", "099", "0120", "0800", "0570", "0990", "0123", "0124", "0125", "0126", "0133", "0134", "0135", "0136", "0137", "0138", "0139", "0142", "0143", "0144", "0145", "0146", "0152", "0153", "0154", "0155", "0156", "0157", "0158", "0162", "0163", "0164", "0165", "0166", "0167", "0172", "0173", "0174", "0175", "0176", "0178", "0179", "0182", "0183", "0184", "0185", "0186", "0187", "0191", "0192", "0193", "0194", "0195", "0197", "0198", "0220", "0223", "0224", "0225", "0226", "0228", "0229", "0233", "0234", "0235", "0237", "0238", "0240", "0241", "0242", "0243", "0244", "0246", "0247", "0248", "0250", "0254", "0255", "0256", "0257", "0258", "0259", "0260", "0261", "0263", "0264", "0265", "0266", "0267", "0268", "0269", "0270", "0274", "0276", "0277", "0278", "0279", "0280", "0282", "0283", "0284", "0285", "0287", "0288", "0289", "0291", "0293", "0294", "0295", "0296", "0297", "0299", "0422", "0428", "0436", "0438", "0439", "0460", "0463", "0465", "0466", "0467", "0470", "0475", "0476", "0478", "0479", "0480", "0493", "0494", "0495", "0531", "0532", "0533", "0536", "0537", "0538", "0539", "0544", "0545", "0547", "0548", "0550", "0551", "0553", "0554", "0555", "0556", "0557", "0558", "0561", "0562", "0563", "0564", "0565", "0566", "0567", "0568", "0569", "0572", "0573", "0574", "0575", "0576", "0577", "0578", "0581", "0584", "0585", "0586", "0587", "0594", "0595", "0596", "0597", "0598", "0599", "0721", "0725", "0735", "0736", "0737", "0738", "0739", "0740", "0742", "0743", "0744", "0745", "0746", "0747", "0748", "0749", "0761", "0763", "0765", "0766", "0767", "0768", "0770", "0771", "0772", "0773", "0774", "0776", "0778", "0779", "0790", "0791", "0794", "0795", "0796", "0797", "0798", "0799", "0820", "0823", "0824", "0826", "0827", "0829", "0833", "0834", "0835", "0836", "0837", "0838", "0845", "0846", "0847", "0848", "0852", "0853", "0854", "0855", "0856", "0857", "0858", "0859", "0863", "0865", "0866", "0867", "0868", "0869", "0875", "0877", "0879", "0880", "0883", "0884", "0885", "0887", "0889", "0892", "0893", "0894", "0895", "0896", "0897", "0898", "0920", "0930", "0940", "0942", "0943", "0944", "0946", "0947", "0948", "0949", "0950", "0952", "0954", "0955", "0956", "0957", "0959", "0964", "0965", "0966", "0967", "0968", "0969", "0972", "0973", "0974", "0977", "0978", "0979", "0980", "0982", "0983", "0984", "0985", "0986", "0987", "0993", "0994", "0995", "0996", "0997", "01267", "01372", "01374", "01377", "01392", "01397", "01398", "01456", "01457", "01466", "01547", "01558", "01564", "01586", "01587", "01632", "01634", "01635", "01648", "01654", "01655", "01656", "01658", "04992", "04994", "04996", "04998", "05769", "05979", "07468", "08387", "08388", "08396", "08477", "08512", "08514", "09496", "09802", "09912", "09913", "09969")


input = "04811112222"
disp(Main(input))



' 
'  hostへ文字列を出力するsub routine
'  @param {string} str
'  @example
'  disp("Hello, World!")
' 
Sub disp(str)
    'display.log(str)
    'console.log(str)
    'WinActorでの利用を考えると、ここでSetUMSVariableを呼び出すなど。
  WScript.Echo(str)
End Sub


'
'  指定した3桁の数字区切りで電話番号をハイフンフォーマットする関数
'  @param {string} telnum - ハイフンなしの電話番号
'  @param {string} fmt - フォーマット用の3桁の数値
'  @return {string} ハイフン付きでフォーマットされた電話番号
'  @example 
'  let tel_formtd = FormatTelnum("0120112222","424")
'  // tel_formtd = "0120-11-2222"
'
Function FormatTelnum(telnum, fmt)
  fmt1 = CInt( Mid(fmt,1,1) )
  fmt2 = CInt( Mid(fmt,2,1) )
  fmt3 = CInt( Mid(fmt,3,1) )

  t1 = Mid(telnum, 1, fmt1)
  t2 = Mid(telnum, fmt1+1, fmt2)
  t3 = Mid(telnum, fmt1+fmt2+1, fmt3)

  output = t1 & "-" & t2  & "-" & t3
  FormatTelnum = output
End Function


' 
'  電話番号接頭辞集合Sに電話番号telnumが含まれているか調べる関数
'  @param {string} telnum - ハイフンなしの電話番号
'  @return {string} 電話番号接頭辞もしくは"notfound"を返す
' 
Function FindTelnumPrefix(telnum)
    prefix_ = "notfound"

    For i = 0 To UBound(S)
        If S(i) = Mid(telnum, 1, Len(S(i)) ) Then
            prefix_ = S(i)
        End If	
    Next

    FindTelnumPrefix = prefix_
End Function



Function Zen2Han(str)
  
End Function


Function Main(t)
 If Len(t) < 10 Then
   Main = t
 Else 
   prefix = FindTelnumPrefix(t)
   If prefix = "notfound" Then
     Select Case Len(t)
       Case 11
         Main = FormatTelnum(t,"344")
       Case 10
         Main = FormatTelnum(t,"334")
       Case Else
         Main = FormatTelnum(t,"344")
     End Select
   Else
     If (prefix = "0120") or (prefix = "0570") Then
       Main = FormatTelnum(t,"433")
     Else
       Select Case Len(prefix)
          Case 2
              Main = FormatTelnum(t, "244")
          Case 3
              Main = FormatTelnum(t, "334")
          Case 4
              Main = FormatTelnum(t, "424")
          Case 5
              Main = FormatTelnum(t, "514")
       End Select
     End If
   End If
 End If
End Function

@axjack
Copy link
Author

axjack commented Feb 21, 2020

「終了していない文字列型の定数です」が出たとき → たぶん文字コードがアレな時に出ていると思われる。

C:\Users\Satoaki NOGUCHI\Desktop\test2.vbs(3, 16) Microsoft VBScript コンパイ ル エラー: 終了していない文字列型の定数です。

see https://oshiete.goo.ne.jp/qa/8213411.html

@axjack
Copy link
Author

axjack commented Feb 21, 2020

全角半角変換を記載し忘れた・・・。がこれを書こうとした時に上記のエラーが出たのであった(備忘録)

Function Zen2Han(str)
  
End Function

@axjack
Copy link
Author

axjack commented Feb 24, 2020

半角数字のみを抽出する関数

dim re
set re = createObject("VBScript.RegExp")

'test
disp( extractHWNumber("0120-(00)-1234") )

'Copyright (C) Microsoft Corporation. All rights reserved.
'
'0120001234


'
'  文字列から半角数字抽出する関数
'  @param {string} inp - 半角数字を含んだ文字列
'  @return {string} 半角数字のみの文字列
'  @example 
'  telnumber = extractHWNumber("0120-(00)-1234")
'  // telnumber = "0120001234"
'
function extractHWNumber(inp)
  'thanks to https://vbabeginner.net/vba%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%81%8B%E3%82%89%E6%95%B0%E5%AD%97%E3%81%AE%E3%81%BF%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B/
  re.pattern = "[^0-9]"
  re.global = true
  extractHWNumber = re.replace(inp,"")
end function


Sub disp(str)
    'display.log(str)
    'console.log(str)
    'WinActorでの利用を考えると、ここでSetUMSVariableを呼び出すなど。
  WScript.Echo(str)
End Sub

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment