質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.98%

  • Go

    422questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

文字列の中から数字を探すコードを書きたいです

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 275

DDxlk

score 111

やりたいこと

例えば
"100時間"
という文字列があったとします。
この中から100という数字を探して、int型として抜き出したいです。

与えられる文字列の条件としては
・かならず 100時間 や 20分 のように数字+文字列の形となっています。
・必ず数字、文字列の順番です

やったこと

unicode.IsDigit()にruneを渡せば判断できるようなので、それを使って関数を書いてみましたが...
https://play.golang.org/p/wrhXOE2aOD

func main()  {
    factor := "100時間"
    i := numCheck(factor)
    fmt.Println(i) //output: 64469
}

func numCheck(factor string) int32 {
    var num int32
    for _, f := range factor {
        if !unicode.IsDigit(f) {
            num += f
        }
    }
    return num
}

これではint32の値しかわかりません。
このint32の値をintに変換するか、もしくはnumCheckの判別方法を根本的に変えないといけません。

もちろん、文字列の区切りを微調整しつつstrconv.Atoi()の返り値で判断するというようなこともできます。
以下例
https://play.golang.org/p/jR2zEwqr3I

func numCheck(factor string) int {
    var i = 0
    for {
        res, _ := strconv.Atoi(factor)
        if res != 0 {
            return res
        } else {
            factor = factor[:len(factor) - i]
        }
        i ++
    }
}


正直どちらもくどいので、何かスマートな方法を探しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

文字列の先頭部分の数字の並びの取り出しを正規表現にまかせた例を書いてみました。

package main

import (
    "fmt"
    "regexp"
    "strconv"
)

func main()  {
    factor := "100時間"
    i := ParseLeadingInt(factor)
    fmt.Println(i)
}

var rexLeadingDigits = regexp.MustCompile(`\d+`)

func ParseLeadingInt(s string) int {
    rex := rexLeadingDigits.Copy()
    value, _ := strconv.Atoi(rex.FindString(s))
    return value
}

なお、複数モジュールから使うという想定で以下のようにしてます

goには暗いのでおかしなところがあったらご容赦ください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/04 14:04 編集

    回答ありがとうございます!
    なるほど、確かにregexpを使えば簡単にできますね
    完全に失念していました
    参考になります

    キャンセル

  • 2017/11/04 14:03

    goの解説サイトなどみてて面白く感じたことがあります。「Regexpは他のスクリプト系言語のパフォーマンスと同等なので、性能的に問題」という言い方をしている点です。最初なにいってるかわかりませんでしたw;

    goはスピード重視の言語らしく、他の言語と同等性能ではgoとしてはイカン!ということなんでしょうかね。

    キャンセル

  • 2017/11/04 14:10

    なるほどw
    すみません、もう一つ質問なんですが、`\d+`これはどういう意味ですか?

    キャンセル

  • 2017/11/04 14:22

    \, d, +を含む3文字の文字列の表記の一つですが、"\\d+"とも書けるようで、バッククォートで囲むと単にバックスラッシュなどの特殊文字をエスケープしなくてよくなるということのようです。他の言語にもよくあります。例えばC#でファイルパスを表現するときの
    var path="C:\\a\\b"

    var path=@"C:\a\b"
    の違いみたいなものだと思います。

    キャンセル

  • 2017/11/04 14:30

    バッククォートの使用用途等はわかるのですが、/d+の意味自体がわかりませんでした
    調べたところ、正規表現の文法で/dが0~9の数値、+は「それ以降ずっと」という意味なので
    「1文字以上の数値」という意味だとわかりました

    キャンセル

  • 2017/11/04 14:32 編集

    ・・・あ、そっちでしたか。正規表現の意味についてはおっしゃるとおりと思います。正確には+は「1回以上の任意の回数の繰り返し」です。

    キャンセル

checkベストアンサー

+1

これくらいであればパッケージを使わず書いた方がパフォーマンス出ます。

package main

import (
    "fmt"
)

func numCheck(s string) int {
    n := 0
    for _, r := range s {
        if '0' <= r && r <= '9' {
            n = n * 10 + int(r - '0')
        } else {
            break
        }
    }
    return n
}

func main() {
     factor := "100時間"
    i := numCheck(factor)
    fmt.Println(i)
}


001 の場合も 1 になりますが。(もちろん strconv.Atoi でも同じです)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Go

    422questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。