- PR -

vb.netでの"."について

投稿者投稿内容
uniqque
常連さん
会議室デビュー日: 2005/03/18
投稿数: 43
投稿日時: 2005-04-03 23:11
VB.NETにて"."を削除するコードを実装しているのですが
うまくいきません。
以下がコードです。

'textからsubstring()で一文字ずつ調べ、"."が出たらループを抜けます
Dim text As String="3.5"
Dim i As Integer = 0
Dim keisub As String
While (text.Substring(i, i + 1) <> "." And i < text.Length - 1)
keisub = keisub + text.Substring(i, i + 1)
i += 1
End While

これでkeisubには"3"が入るはずなのですが
"."が一文字として取られておらず、".5"が一文字として
取られているみたいなんです。
なのでエラーが出て終了してしまいます。
IndexOf()で"."の位置を調べてみるとちゃんと1が返ってきます。
Length()でもちゃんと3が返ってきます。
原因が分かりません。
もしかしてsubstring()がそういう仕様なのでしょうか。
初歩的な質問なのですがどなたかアドバイス頂けないでしょうか。
よろしくおねがいします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-04-03 23:24
unibon です。こんにちわ。
#最近 .NET のプログラムをやり始めた者です。

引用:

delichoさんの書き込み (2005-04-03 23:11) より:
keisub = keisub + text.Substring(i, i + 1)

もしかしてsubstring()がそういう仕様なのでしょうか。


提示されたコードは全部見ていませんが、.NET の String クラスの substring メソッドの、(1から数えて)第2引数が、文字位置ではなく文字数なのですが、十中八九、そのためではないでしょうか?これは、勘違いし易い、分かりにくい仕様だと思います。Java や JavaScript にも同名のメソッドがあるのに、引数の意味が違うのは納得いかないです。
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemStringClassSubstringTopic2.asp
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-04-03 23:37
replace(text,".","")
じゃ駄目ですかね。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-04-03 23:41
諸農です。

引用:

VB.NETにて"."を削除するコードを実装しているのですが



文字列から全部の「.」を取り除くならString.Replace()を
使った方が便利ではないでしょうか。

文字列の先頭から検索して最初に出てきた「.」よりも前の
文字列を取得したいのであれば、IndexOf()を使って位置を
取得して、Substring()すればOKですね。

C#ですが、

コード:
string Src = "3.5";

string retStr1 = Src.Replace('.','');

int p = Src.IndexOf('.');
if (p > 0) string retStr2 = Src.Substring(0,p);



みたいな感じになると思います。
#オン書きなのでコードは未検証です。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
uniqque
常連さん
会議室デビュー日: 2005/03/18
投稿数: 43
投稿日時: 2005-04-04 00:03
たくさんのアドバイスありがとうございます。
substring()の引数がVB.NETとJavaでは違うのですね。。。
第二引数に文字数の1を与えたらうまくいきました。
VB.NETについてもっと勉強します。ありがとうございました。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-04-04 09:06
引用:

substring()の引数がVB.NETとJavaでは違うのですね。。。
第二引数に文字数の1を与えたらうまくいきました。



Javaと違うのは仕方ないとしても、ちょっと気になったのは
「文字数の1を与える」というのは正確ではないと思います。
私の気の回しすぎならごめんなさい。
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-05 05:29
> 私の気の回しすぎならごめんなさい。
 私も気になるのですが、ソースを見ると、
> VB.NETにて"."を削除するコードを実装している
のではなく、文字列の先頭から"."までを抽出する、のようです。

例:
3.5→3
13.67→13
0.1234→0
.456→空文字列?
1.2.3.4→1

で、いいのでしょうか?>delichoさん

 NAL-6295さんやJubeiさんが提示されたメソッドだと、次のようになります。

3.5→35
13.67→1367
0.1234→01234
.456→456
1.2.3.4→1234

もし、本当にやりたいことが「実数を整数化する」であれば、Mathクラスを使うのですが???


unibonさん>
> Java や JavaScript にも同名のメソッドがあるのに、
> 引数の意味が違うのは納得いかないです。
 これですね。STLのstringクラスでは、substrの引数はインデックスと文字数です。C→C++→.NET Framework(→Java)の私には、Javaの方が納得いかないです(^-^;

_________________
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-04-05 08:44
unibon です。こんにちわ。

引用:

Jittaさんの書き込み (2005-04-05 05:29) より:
> Java や JavaScript にも同名のメソッドがあるのに、
> 引数の意味が違うのは納得いかないです。
 これですね。STLのstringクラスでは、substrの引数はインデックスと文字数です。C→C++→.NET Framework(→Java)の私には、Javaの方が納得いかないです(^-^;


たとえば、JavaScript だと、substr と substring があり、substr が文字数指定で substring がインデックス指定です。だから substring と名の付くものは、やっぱりインデックスでの指定であってほしいのです。
というか、そもそもフルスペル(substring)か単語の省略(substr)で、意味を違わせないでほしかったことを JavaScript に望みたかったです。

スキルアップ/キャリアアップ(JOB@IT)