2010-01-05 14 views
7

¿Hay alguna manera mejor de analizar el porcentaje para duplicarlo?Porcentaje de parse al doble

Dim Buffer As String = "50.00%" 
Dim Value As Double = Double.Parse(Buffer.Replace("%",""), NumberStyles.Any, CultureInfo.InvariantCulture)/100 
+3

Por qué código el símbolo de porcentaje (%) cuando se podría utilizar : http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.percentsymbol.aspx – rohancragg

Respuesta

7

La forma en que lo está haciendo parece bueno para mí .

El único punto que tendría cuidado es que su programa asume InvariantCulture. Asegúrate de que esto sea realmente lo que quieres decir. Por ejemplo, podría ser mejor utilizar la cultura predeterminada de la máquina si la cadena proviene de la entrada del usuario en lugar de un protocolo fijo bien definido.

+0

Invariant.Culture es solo para la simplicidad de la muestra. Stackoverflow no tiene entrada de usuario para mi código de muestra :-) –

1

No estoy familiarizado con VB pero la creación de una función de lo que ya es mejor

pseudo código:

function PercentToDouble(Buffer) 
    return Double.Parse(Buffer.Replace("%",""), NumberStyles.Any, CultureInfo.InvariantCulture)/100; 
endfunction 
3

Es posible que vota por este Framework 4 sugerencia en Microsoft Connect: Extend double.Parse to interpret Percent values

+1

He votado. ¿Recibo una calcomanía;) – dbasnett

+0

No me di cuenta de la antigüedad que tenía ... – dbasnett

+0

@dbasnett Triste, parece que la sugerencia se cerró sin una explicación o una explicación adecuada de por qué la cerraban. –

0

Si el porcentaje es la entrada del usuario a continuación

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
    Dim pb As New PictureBox 
    Dim foo As New gameObj(pb, gameObjType.person) 

    Dim sInps() As String = New String() {"50.00 %", "51.00%", ".52", "53", ".54%"} 

    For Each sampleInput As String In sInps 
     Debug.WriteLine(ConvertPercentToDouble(sampleInput).ToString("n4")) 
    Next 

End Sub 

Private Function ConvertPercentToDouble(s As String) As Double 
    Dim Value As Double 
    Dim hasPercent As Boolean = s.Contains(System.Globalization.NumberFormatInfo.CurrentInfo.PercentSymbol) 
    Dim whereIsPC As Integer = Math.Max(s.IndexOf(" "), _ 
             s.IndexOf(System.Globalization.NumberFormatInfo.CurrentInfo.PercentSymbol)) 
    If Double.TryParse(s, Value) _ 
     OrElse Double.TryParse(s.Substring(0, whereIsPC).Trim, Value) Then 
     If Value > 1 OrElse hasPercent Then Value /= 100 
     Return Value 
    Else 
     Throw New ArgumentException("YOUR ERROR HERE") 
    End If 
End Function