プログラム言語 標準関数(テキスト系)
目次
入出力
入力
my $str =
	my @str = ();
	for my $inpcnt (0..2){
	 $str[$inpcnt] = ;
	 chomp $str[$inpcnt];
	}
  
出力
	※メッセージのみ
	MessageBox.Show(text: “Hello”);
	※+キャプション(Window上部)
	MessageBox.Show(
	  text: “Hello”,
	  caption: “caption”);
	※+ボタン
	MessageBox.Show(
	  text: “Hello”,
	  caption: “caption”,
	  buttons:MessageBoxButtons.YesNoCancel);
	MessageBoxButtons列挙体メンバー一覧
	OK
	「OK」ボタンのみ。
	OKCancel
	「OK」/「キャンセル」ボタン。
	AbortRetryIgnore
	「中止」/「再試行」/「無視」ボタン。メッセージボックスの閉じるボタンが無効。
	YesNoCancel
	「はい」/「いいえ」/「キャンセル」ボタン。
	YesNo
	「はい」/「いいえ」ボタン。メッセージボックスの閉じるボタンが無効。
	RetryCancel
	「再試行」/「キャンセル」ボタン。
	※ボタン操作結果を取得
	DialogResult answer = MessageBox.Show(text: “Hello”,
	  caption: “caption”,
	  buttons:MessageBoxButtons.YesNoCancel);
	if (answer == DialogResult.Yes)
	{
	  ~
	}
	※+アイコン
	MessageBox.Show(text: “Hello”,
	  caption: “caption”,
	  buttons: MessageBoxButtons.YesNoCancel,
	  icon:MessageBoxIcon.Information);
	MessageBoxIcon列挙体メンバ一覧
	None
	アイコンなし
	音:一般警告音
	Hand
	赤丸に白いX(停止マーク)。
	音:システムエラー
	Question
	丸い吹き出しに疑問符記号。
	音:メッセージ(問い合わせ)
	Exclamation
	黄色い三角に感嘆符記号。
	音:メッセージ(警告)
	Asterisk
	丸い吹き出しに「i」。
	音:メッセージ(情報)
	Stop
	Handと同じ。
	Error
	Handと同じ。
	Warning
	Exclamationと同じ。
	Information
	Asteriskと同じ。
  
	std::cout << 5 << '\n';
	std::cout << 5 << std::endl;
MessageBox.Show(text:="Hello")
	※+キャプション(Window上部)
	MessageBox.Show(text:="Hello",
	  caption:="caption")
	※+ボタン
	MessageBox.Show(text:="Hello",
	  caption:="caption",
	  buttons:=MessageBoxButtons.YesNoCancel)
	  
	※MessageBoxIcon列挙体メンバ一覧は「C#」参照
	※ボタン操作結果を取得
	Dim answer As DialogResult = MessageBox.Show(text:="Hello",
	  caption:="caption",
	  buttons:=MessageBoxButtons.YesNoCancel)
	If answer = DialogResult.Yes Then
	  ~
	End If
	※+アイコン
	MessageBox.Show(text:="Hello",
	  caption:="caption",
	  buttons:=MessageBoxButtons.YesNoCancel,
	  icon:=MessageBoxIcon.Information)
	  
	MessageBoxIcon列挙体メンバ一覧は「C#」参照
  
#標準出力
print "test";
print "test\n";
print "test","\n";
my $es = "es";
print "t",$es,"t","/n"
print "t$est","/n"
⇒test
	say
	#標準出力。自動で改行される。
	say "test";
	⇒test
  
テキスト操作
型変換
「プログラム言語 データ型:型情報」参照
StringBulder
String型の変数にリテラルを格納する場合、
変数、リテラル両方のメモリ領域を必要とする。
変数に別のリテラルを格納する為には更に別のリテラル用のメモリ領域も必要で非効率。
String s;
s = "aaa"
s = "bbb"
※"aaa" と "bbb" は別のメモリ領域
※"aaa" はどこからも参照される事なく無駄に残り続ける。
メモリに関して効率良く文字列を管理する為のクラスがStringBuilder
内部ではchar型配列の組み合わせを外部からはString型の様に利用できる。
String型の値を頻繁に書き換える必要がある場合に使用。
sb : aa
sb.toString() : aa
sb.capacity() : 18;
//16文字分の配列のバッファ + aa(2文字)分の配列のバッファ
	sb.append("bb");
	// sb : aabb
	sb.append("cc");
	// sb : aabbcc
	sb.insert(2, "dd");
	// index : 0a1a2b3b4c5c6
	// sb : aaddbbcc
	sb.delete(4, 6);
	// index : 0a1a2d3d4b5b6c7c8
	// sb : aaddcc
	sb.deleteCharAt(0);
	sb.deleteCharAt(0);
	// sb : ddcc
	sb.reverse();
	// sb : ccdd
	sb.replace(1,3, "zz");
	// sb : czzd
	//メソッドチェーンによる記述も可
	sb.append("cc").insert(0, "ee");
  
複写
using namespace std;
char c[50];
	要素数が定義されている文字配列にコピー
	strcpy_s(c, 50, "VisualC++");
	cout << c << '\n';
	→VisualC++
	↓ も可(要素数省略)
	strcpy_s(c, "VisualC++");
	cout << c << '\n';
	→VisualC++
	char *myStr = "VisualC++";
	char c[50];
	strcpy_s(c, 50, myStr);
	cout << c << '\n';
	→VisualC++
char c*;
	strcpy_s(c, "VisualC++");
	→コンパイルエラー
	strcpy_s(c, ?, myStr);
	コピー先のサイズが未定の為
	char temp[50] = "VisualC++";
	char *c = temp;
	strcpy_s(c, 50, "VisualC++");
	cout << c << '\n';
	→VisualC++
	要素数が固定されているので○
	指定の文字数分のみ複写
	文字配列に対してのみ複写可能(ポインタ不可)
	char before[] = "VisualC++";
	char after[10];
	strncpy_s(after, before, 3);
	cout << after << '\n';
	→Vis
	strncpy_s(after, before, _countof(after)-1);
	cout << after << '\n';
	→VisualC++
	strncpy_s(after, before, 20);
	→実行時エラー
	ポインタに複写は不可
	char *before = "VisualC++";
	char *after = "          ";
	strncpy_s(after, before, 5);
	→コンパイルエラー
	char *before = "VisualC++";
	char temp[10];
	char *after = temp;
	strncpy_s(after, before, 5);
	→コンパイルエラー
追加(結合)
newStr:AAABBBCCC
	int a = 123;
	string b = @"BBB";
	string c = @"CCC";
	string str = string.Join(",", a, b, c);
	str:123,BBB,CCC
char *before2 = "VisualC#";
char after[50];
	strncpy_s(after, before1, _countof(after));
	要素数が定義されている文字配列の末尾に追加
	strcat_s(after, before2);
cout << after << '\n'; →VisualC++VisualC#
	strncpy_s(after, before1, 6);
	要素数が定義されている文字配列の末尾に指定数文字数分追加
	strncat_s(after, before2, 6);
cout << after << '\n'; →VisualVisual
$s2 = "bbb";
$s = $s1 . $s2;
$s .= "ccc";
→ aaabbbccc
	$before = ['a', 'b', 'c'];
	$after = implode(",", $before);
	→'a,b,c'
print(s)
# aaabbbccc
    s = 'aaa'
    s += 'bbb'
    s += 'ccc'
    print(s)
    # aaabbbccc
    s = 'aaa'\
       'bbb'\
       'ccc'
    print(s)
    # aaabbbccc
    print(1 + '1') # エラー
    print(str(1) + '1') # 11
  
比較
String型は基本型ではなく、参照型。
(「プログラム言語 変数/データ型」参照)
string s2 = "TEST";
"TEST" というリテラルがメモリ領域に作成され、
s1、s2ともそこを参照する。
	// 参照値の比較
	bool ret1 = (s1 == s2);
	⇒ ret1 : true
	// 文字列の比較
	bool ret2 = s1.Equals(s2);
	⇒ ret2 : true
	string s3 = new string ("TEST");
	string s4 = new string ("TEST");
	"TEST" というリテラルが2つメモリ領域に作成され、
	s1、s2それぞれ別のメモリ領域を参照する。
	// 参照値の比較
	bool ret3 = (s3 == s4);
	⇒ ret3 : false
	// 文字列の比較
	bool ret4 = s3.Equals(s4);
	⇒ ret4 : true
  
char myChar2[] = "VisualC#";
	int result;
	result = strcmp(myChar1, myChar2);
	result:1
	char myChar1[] = "VisualC++";
	char myChar2[] = "VisualC++";
	result = strcmp(myChar1, myChar2);
	result:0
	char *myChar1 = "VisualC++";
	char *myChar2 = "VisualC#";
	result = strcmp(myChar1, myChar2);
	ポインタOK
	result:1
	指定文字数分の比較
	result = strncmp(myChar1, myChar2, 6);
	result:0
//⇒bool : false;
	bool = x.Equals(x)
	//⇒bool : true;
  
String s2 = "TEST";
"TEST" というリテラルがメモリ領域に作成され、
s1、s2ともそこを参照する。
	// 参照値の比較
	Boolean ret1 = (s1 == s2);
	⇒ ret1 : true
	// 文字列の比較
	Boolean ret2 = s1.equals(s2);
	⇒ ret2 : true
	String s3 = new String("TEST");
	String s4 = new String("TEST");
	"TEST" というリテラルが2つメモリ領域に作成され、
	s1、s2それぞれ別のメモリ領域を参照する。
	// 参照値の比較
	Boolean ret3 = (s3 == s4);
	⇒ ret3 : false
	// 文字列の比較
	Boolean ret4 = s3.equals(s4);
	⇒ ret4 : true
String myStr = "abc";
	Boolean a = myStr.startsWith("a");
	⇒true
	Boolean b = myStr.startsWith("b");
	⇒false
	Boolean c = myStr.startsWith("c", 2);
	⇒true
  
検索(判定・位置)
bool:true
	bool ret = "12345".All(x => x == 'x');
	ret : false
	string s = "123456789";
	int index = s.indexOf("1");
	⇒ index : 0
	int index = s.indexOf("2");
	⇒ index : 1
	int index = s.indexOf("0");
	⇒ index : -1
  
char myChar2[] = "VisualC#";
char *result;
	検索した文字が最初に現れるアドレスを取得
	result = strchr(myChar1, 'C');
	ポインタOK。
	result:C++
	result = strchr(myChar2, 'C');
	result:C#
	検索した文字列が最初に現れるアドレスを取得
	result = strstr(myChar1, "C");
	ポインタOK。
	result:C++
	result = strstr(myChar2, "C");
	result:C#
Dim index As Integer = s.IndexOf("1")
⇒ index : 0
        Dim index As Integer = s.IndexOf("2")
	⇒ index : 1
        Dim index As Integer = s.IndexOf("0")
	⇒ index : -1
  
if ($pos !== false) {
echo $pos;
→10
}
print('a' in 'abcde') #true
print('z' in 'abcde') #true
    #開始するか?の判定
    print('abcde'.startswith('a')) #true
    print('abcde'.startswith('e')) #false
    #終了するか?の判定
    print('abcde'.endswith('a')) #false
    print('abcde'.endswith('e')) #true
    #開始位置
    print('abcabc'.find('a')) #0(先頭位置)
    print('abcabc'.find('e')) #-1
    print('abcabcabc'.rfind('a')) #6(最終位置)
    print('abcabcabc'.rfind('e')) #-1
    print('abcabc'.index('a')) #0(先頭位置)
    print('abcabc'.index('e')) #エラー
    print('abcabcabc'.rindex('a')) #6(最終位置)
    print('abcabcabc'.rindex('e')) #エラー
    isnumeric=str.isnumeric()
    isdecimal=str.isdecimal()
    isdigit=str.isdigit()
    isalpha=str.isalpha()
    isalnum=str.isalnum()
    islower=str.islower()
    isupper=str.isupper()
| isnumeric | isdecimal | isdigit | isalpha | isalnum | islower | isupper | |
|---|---|---|---|---|---|---|---|
| 111 | True | True | True | False | True | False | False | 
| 111 | True | True | True | False | True | False | False | 
| 一壱 | True | False | False | True | True | False | False | 
| Aa | False | False | False | True | True | False | False | 
| aa | False | False | False | True | True | True | False | 
| AA | False | False | False | True | True | False | True | 
| Aa | False | False | False | True | True | False | False | 
| aa | False | False | False | True | True | True | False | 
| AA | False | False | False | True | True | False | True | 
| アア | False | False | False | True | True | False | False | 
| あ亜 | False | False | False | True | True | False | False | 
| #! | False | False | False | False | False | False | False | 
var index = s.indexOf("1");
⇒ index : 0
	var index = s.indexOf("2");
	⇒ index : 1
	var index = s.indexOf("0");
	⇒ index : -1
  
置換
String after = before.Replace(oldValue:"c", newValue:"");
⇒ after : abde
Dim after As String = before.Replace("c","")
⇒ after : abde
	String myAfter = myBefore.replace("AA","BB");
	⇒myAfter : BBBBA
	String myAfter = myBefore.replace('AA','BB');
	⇒コンパイルエラー
	String myAfter = myBefore.replace("AA",'B');
	⇒コンパイルエラー
	String myAfter = myBefore.replace('A','B');
	⇒myAfter : BBBBB
	正規表現を用いた置換(replaceAll)
	置換後文字列 = 置換対象(置換前)文字列.replaceAll("正規表現文字列", "置換する文字列");
	String myStr = "AAAABBBBCCCC";
	String newStr = myStr.replaceAll(".", "Z");
	⇒newStr : ZZZZZZZZZZZZ
  
	$after = str_replace("bbb", "zzz", "aaabbbccc");
	$after:"aaazzzccc"
	検索語を配列で複数指定
	$search = array("aaa","bbb","ccc");
	$search = array("\r\n","\r","\n"); で改行コードを指定可
	$after = str_replace($search, "zzz", "aaabbbccc");
	$after:"zzzzzzzzz"
	$search = array("aaa", "bbb", "ccc");
	$replace = array("AAA", "BBB", "CCC");
	$after = str_replace($search, $replace, "aaabbbccc");
	$after:"AAABBBCCC"
	$search = array("aaa", "bbb", "ccc");
	$replace = array("AAA", "BBB");
	置換文字列が、検索対象より少ない
	$after = str_replace($search, $replace, "aaabbbccc");
	$after:"AAABBB"
	空文字で置換される
	echo str_replace("\r\n", "", "~~")
	→
	~\r\n
	~
        【正規表現を用いた置換】
        $ret = preg_replace( 検索, 置換, 対象);
        $ret = preg_replace( '/正規表現/', ~, ~);
        $ret = preg_replace( '/(\s| )/', '', ' aa a ');
        →aaa
	【htmlへの置換】
	XHTML
	echo nl2br("~\r\n~");
	→
	~
	~
	非XHTML
	echo nl2br("~\r\n~", false);
	→
	~
	~
	【...への置換】
	$ret = $text->truncate(
	 aaaaaaaaaa,
	 5,
	 array(
	  'ending' => '…'
	 )
	);
	$ret →
	aaaaa...
  
$ret = $this->Text->truncate(
aaaaaaaaaa,
5,
array(
'ellipsis' => '…'
)
);
$ret →
aaaaa...
print('aaaaa'.replace('a', 'b')) #bbbbb
    #置換個数を指定
    print('aaaaa'.replace('a', 'b', 3)) #bbbaa
    #正規表現で置換
    import re
print(re.sub(r'^a', 'A', 'aaaaa')) #Aaaaa
    alert( '123' ).replace( '', '');
    →123
    通常置換は1回だけ
    alert( '123' ).replace( //g, '');
    →123
    正規表現利用により置換は最後まで可能
    正規表現利用時
    / で囲む
    末尾にg
  
改行削除
my $input =
; ※5を入力したとする。chomp $input;
$input *= 2;
print $input
⇒ $input : 10
	windows等のテキストファイルの改行を削除する場合
	$str =~ s/\r//;		#CRを削除する
	$str =~ s/\n//;		#LFを削除する
  
トリム
→aaa
String s = " A A A ".trim();
s:"A A A"
	全角スペーストリム
	String s = StringUtils.strip(" ");
	s:""
  
$ret:a aa
大小文字変換
UCase(~)
	小文字変換
	LCase(~)
  
strSmall = LCase(~)
System.out.println(s.toLowerCase()); →abc
System.out.println(s.toUpperCase()); →ABC
print('AAA'.lower()) # aaa
切り出し
	string str1 = CONST_STRING.Substring(3,3);
	⇒str1:def
	※× substring(開始位置, 終了位置)ではない。JAVAとは違う。
	※○ substring(開始位置, 文字数)
  
	Dim str1 As String = Strings.Left(CONST_STRRING, 3)
	⇒str1:abc
	Dim str2 As String = Strings.Right(CONST_STRRING, 3)
	⇒str2:lmn
	Dim str3 As String = Strings.Mid(CONST_STRRING, 3, 3)
	⇒str1:cde
	Dim str4 As String = CONST_STRRING.Substring(startIndex:=3,length:=3)
	⇒str1:def
  
	String myAfter = myBefore.substring(3, 5);
	⇒myAfter : DE
	※× substring(開始位置, 文字数ではない) .Netとは違う
	※○ substring(開始位置, 終了位置)
	String myAfter = myBefore.substring(3, 2);
	⇒実行時エラー
  
$year:2018
print('abcde'[1]) #b
print('abcde'[4]) #e
print('abcde'[-1]) #e(末尾)
print('abcde'[0:2]) #先頭から2文字目
print('abcde'[:2]) #先頭から2文字目
print('abcde'[2:]) #3文字目から末尾
print('abcde'[:]) #先頭から末尾
print('abcde'[-3:]) #後ろから3文字目から末尾
print('abcde'[-3:-2]) #後ろから3文字目から後ろから2文字目
my $after = substr($before,0,2);
⇒ $after : ab
開始位置は0スタート
	var Value = "ABCDEFG".substring( 1 , 3 ) ;
	// ⇒ Value : BC
  
| 構文 | 意味 | 結果 | 
|---|---|---|
| %STR% | 変数STRの値全体 | 12345 | 
| %STR:~2% | 2文字目から、最後まで | 345 | 
| %STR:~2,2% | 2文字目から、2文字分 | 34 | 
| %STR:~2,-2% | 2文字目から、最後の2文字分を除いたもの | 3 | 
| %STR:~-2% | 後ろから2文字目から、最後まで | 45 | 
| %STR:~-3,2% | 後ろから3文字目から、2文字分 | 34 | 
| %STR:~-3,-2% | 後ろから3文字目から、最後の2文字分を除いたもの | 3 | 
文字数
char *myChar2 = "VisualC#";
	int elmCnt;
	elmCnt = strlen(myChar1);
	elmCnt:9
	終端文字(\0)は含まない
	elmCnt = strlen(myChar2);
	ポインタOK
	elmCnt:8
	終端文字(\0)は含まない
  
バイト数
→3
int i = "ア".getBytes(Charset.forName("Shift-JIS")).length;
→2
int i = "ア".getBytes(Charset.forName("UTF-8")).length;
→2
int i = "ア".getBytes(Charset.forName("Shift-JIS")).length;
→1
	int i = "ア".getBytes().length;
	→?
	実行環境(Windows?Linux?)に影響される
	Windows=Shift-Jis、Linux=UTF-8
Char型とString型
myChar1[0] = '1';
myChar1[1] = '2';
myChar1[2] = '3';
//myChar[3] = '4'; はエラー
char[] myChar2 = {'1','2','3'};
char[] myChar3 = "123".ToCharArray();
	int len = myChar1.Length;
	//⇒len:3
	int number = (int)myChar1[0];
	//⇒number:49(文字コード)
	char myChar = (char)number;
	//⇒myChar:'1'
	string myString = myChar.ToString();
	//⇒myString:"1"
  
myChar1(0) = "1"
myChar1(1) = "2"
myChar1(2) = "3"
myChar1(3) = "4"
'myChar1(4) = "5" はインデックスエラー
	Dim myChar2() As Char = {"1", "2", "3"}
	Dim myChar3() As Char = "123".ToCharArray()
	Dim len As Integer = myChar1.Length
	'len:4
	Dim number As Integer = Val(myChar1(0))
	'number:1
	Dim myString As String = number.ToString()
	'myString:"1"
  
バインド(埋め込み)
string disp1 = string.Format("aaaa{0}aaa{1}aaa{2}", myChar1[0] , myChar1[1] , myChar1[2]);
⇒disp1 : "aaaa1aaa2aaa2"
Dim disp1 As String = String.Format("aaaa{0}aaa{1}aaa{2}", myChar1(0), myChar1(1), myChar1(2))
String s = String.format("000%s000%s000%s000", "A","B","C")
	{N}に対して値を指定する
	String s = MessageFormat.format("000{0}000{1}000{2}000","A","B","C");
	String s = MessageFormat.format("000{0}000{1}000{2}000",new Object[]{"A","B","C"}});
S:000A000B000C000
	alert( `ccc${purpose}ccc` );
	→ cccpppccc
  
	連想配列
	$s = "XXXXX$array[name]XXXXX";
	オブジェクト
	$s = "XXXXX{$item->name}XXXXX{$item->method()}";
	定数
	define("TEST_MESSAGE", "テスト");
	定数を出力するためのクロージャ
	$constant = function($c){ return $c; };
$s = "XXXXX{$constant(TEST_MESSAGE)}XXXXX";
print('aaa{}aaa{}aaa'.format('ddd', 'ddd'))
→aaadddaaadddaaa
    print('aaa{0}aaa{1}aaa'.format('ddd', 'ddd'))
    →aaadddaaadddaaa
    print('aaa{a}aaa{b}aaa'.format(a='ddd', b='ddd'))
    →aaadddaaadddaaa
    関数の戻り値をバインド
    print('aaa{a}aaa{b}aaa'.format(a=getString(), b=getString()))
    →aaa(getString()の戻り値)aaa(getString()の戻り値)aaa
    配列
    ary = ['php', 'java', 'python']
    print('{0[0]}、{0[1]}、{0[2]}'.format(ary))
    連想配列
    ary = {'php':'CakePHP3', 'java':'Spring-Boot', 'python':'Django'}
    print('{0[php]}、{0[java]}、{0[python]}'.format(ary))
    #f文字への埋め込み
    str1 = 'ddd'
    str2 = 'ddd'
    print(f'aaa{str1}aaa{str2}aaa')
    →aaadddaaadddaaa
    print(f'aaa{getString()}aaa{getString()}aaa')
    →aaa(getString()の戻り値)aaa(getString()の戻り値)aaa
  
my @z = (c,c,c);
	#「"」で囲まれた文字列中の変数
	print "aaa$y@z";
	⇒aaabbbccc
	#「'」で囲まれた文字列中の変数
	print 'aaa$y@z';
	⇒aaa$y@z
  
0埋め
disp2:55000
string disp3 = "55".PadRight(5, ' ');
disp2: 55
	通常の{0}、{1} に加え、書式:xxxxxを指定する
	string disp4 = String.Format("{0:00000}", 55);
	⇒disp4 : "00055"
Dim disp3 As String = "55".PadRight(5, CType(" ", Char))
'通常の{0}、{1} に加え、書式:xxxxxを指定する
Dim disp4 As String = String.Format("{0:00000}", 55)
'⇒disp4 : "00055"
→00123
s = String.format("%5s", 123);
→ 123
s = String.format("%5s", "123").replace(" ", "0");
→00123
s = String.format("%,d", 123567);
→1,234,567
→00009
	sprintf('%5s', 9)
	→    9
  
print('python'.rjust(10, ' ')) # ____python
print('python'.rjust(10, '0')) # 0000python
    print('python'.ljust(10)) # python____
    print('python'.ljust(10, ' ')) # python____
    print('python'.ljust(10, '0')) # python0000
    print('python'.center(10)) # __python__
    print('python'.center(10, ' ')) # __python__
    print('python'.center(10, '0')) # 00python00
("0" + value).slice(-2);
// ⇒ value : 05
小数点桁指定
string disp5 = String.Format("{0:0.00000}", 55.123);
//⇒disp5 : "55.12300"
	//小数点桁指定&0埋め
	string disp6 = String.Format("{0:000.00000}", 12.345);
	//⇒disp6 : "012.34500"
Dim disp5 As String = String.Format("{0:0.00000}", 55.123)
'⇒55.12300
	'小数点桁指定&0埋め
	Dim disp6 As String = String.Format("{0:000.00000}", 55.123)
	'⇒055.12300
// ⇒ value : 0.33
桁区切り
string disp7 = String.Format("{0:#,#}", 123456789);
//⇒disp7 : 123,456,789
	//カンマ区切り&小数点桁指定
	string disp8 = String.Format("{0:#,#.00}", 12345.6);
	//⇒disp8 : 12,345.60
  
Dim disp7 As String = String.Format("{0:#,#}", 1234567890)
'⇒1,234,567,890
	'カンマ区切り&小数点桁指定
	Dim disp8 As String = String.Format("{0:#,#.00}", 12345.6)
	'⇒12,345.60
  
echo number_format(1234.567, 0);
→1,235
小数点以下四捨五入
	echo number_format(1234.567, 2);
	→1,234.57
	小数点第三位を四捨五入
Null
Null判定
	ret = string.IsNullOrWhiteSpace(value: @"AAA");
	ret:false
	ret = string.IsNullOrWhiteSpace(value: @" ");
	ret:true
	ret = string.IsNullOrWhiteSpace(value: @"");
	ret:true
	ret = string.IsNullOrWhiteSpace(value: null);
	ret:true
	ret = string.IsNullOrEmpty(value: @"AAA");
	ret:false
	ret = string.IsNullOrEmpty(value: @" ");
	ret:false
	ret = string.IsNullOrEmpty(value: @"");
	ret:true
	ret = string.IsNullOrEmpty(value: null);
	ret:true
System.out.println(Objects.isNull(null)); // true
System.out.println(Objects.isNull("Java")); // false
	System.out.println(Objects.nonNull(null)); // false
	System.out.println(Objects.nonNull("Java")); // true
	System.out.println(Objects.compare(null, null, Comparator.naturalOrder())); // 0
	System.out.println(Objects.compare("Java", "Java", Comparator.naturalOrder())); // 0
	System.out.println(Objects.compare("Java", "PHP", Comparator.naturalOrder())); // -~
	System.out.println(Objects.compare("Java", null, Comparator.naturalOrder())); // 例外
	Object obj = Objects.requireNonNull("Java"); // obj:"Java"
	Object obj = Objects.requireNonNull(null); // 例外
	Object obj = Objects.requireNonNull(null, "nullです"); // 例外メッセージ
  
nullでない時の処理
}
| 値 | isset() | empty() | is_null() | ===null | ==='' | 
|---|---|---|---|---|---|
| 1 数字 | 1 | 0 | 0 | 0 | 0 | 
| 'a' 文字 | 1 | 0 | 0 | 0 | 0 | 
| null | 0 | 1 | 1 | 1 | 0 | 
| '' | 1 | 1 | 0 | 0 | 1 | 
	null合体演算子(PHP7以降)
	$result = $aaa ?? 1;
	↓と同じ
	$result = is_null($aaa) ? 1 : $aaa;
  

