parent
653ad20c67
commit
ad5b4b52e8
@ -0,0 +1,93 @@ |
|||||||
|
/* |
||||||
|
* Mini Object Storage, (C) 2014 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package strbyteconv |
||||||
|
|
||||||
|
import ( |
||||||
|
"errors" |
||||||
|
"fmt" |
||||||
|
"regexp" |
||||||
|
"strconv" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
UNIT_BYTE = 1 |
||||||
|
UNIT_KILOBYTE = 1024 * UNIT_BYTE |
||||||
|
UNIT_MEGABYTE = 1024 * UNIT_KILOBYTE |
||||||
|
UNIT_GIGABYTE = 1024 * UNIT_MEGABYTE |
||||||
|
UNIT_TERABYTE = 1024 * UNIT_GIGABYTE |
||||||
|
) |
||||||
|
|
||||||
|
func BytesToString(bytes uint64) string { |
||||||
|
var unit string = "B" |
||||||
|
var value uint64 = 0 |
||||||
|
|
||||||
|
switch { |
||||||
|
case bytes >= UNIT_TERABYTE: |
||||||
|
unit = "TB" |
||||||
|
value = uint64(bytes / UNIT_TERABYTE) |
||||||
|
case bytes >= UNIT_GIGABYTE: |
||||||
|
unit = "GB" |
||||||
|
value = uint64(bytes / UNIT_GIGABYTE) |
||||||
|
case bytes >= UNIT_MEGABYTE: |
||||||
|
unit = "MB" |
||||||
|
value = uint64(bytes / UNIT_MEGABYTE) |
||||||
|
case bytes >= UNIT_KILOBYTE: |
||||||
|
unit = "KB" |
||||||
|
value = uint64(bytes / UNIT_KILOBYTE) |
||||||
|
case bytes < UNIT_KILOBYTE && bytes >= UNIT_BYTE: |
||||||
|
unit = "B" |
||||||
|
value = uint64(bytes / UNIT_BYTE) |
||||||
|
} |
||||||
|
|
||||||
|
return fmt.Sprintf("%d%s", value, unit) |
||||||
|
} |
||||||
|
|
||||||
|
func StringToBytes(s string) (uint64, error) { |
||||||
|
var bytes uint64 |
||||||
|
|
||||||
|
StringPattern, err := regexp.Compile(`(?i)^(-?\d+)([KMGT])B?$`) |
||||||
|
if err != nil { |
||||||
|
return 0, err |
||||||
|
} |
||||||
|
|
||||||
|
parts := StringPattern.FindStringSubmatch(strings.TrimSpace(s)) |
||||||
|
if len(parts) < 3 { |
||||||
|
return 0, errors.New("Incorrect string format must be K,KB,M,MB,G,GB") |
||||||
|
} |
||||||
|
|
||||||
|
value, err := strconv.ParseUint(parts[1], 10, 0) |
||||||
|
if err != nil || value < 1 { |
||||||
|
return 0, err |
||||||
|
} |
||||||
|
|
||||||
|
unit := strings.ToUpper(parts[2]) |
||||||
|
switch unit { |
||||||
|
case "T": |
||||||
|
bytes = value * UNIT_TERABYTE |
||||||
|
case "G": |
||||||
|
bytes = value * UNIT_GIGABYTE |
||||||
|
case "M": |
||||||
|
bytes = value * UNIT_MEGABYTE |
||||||
|
case "K": |
||||||
|
bytes = value * UNIT_KILOBYTE |
||||||
|
case "B": |
||||||
|
bytes = value * UNIT_BYTE |
||||||
|
} |
||||||
|
|
||||||
|
return bytes, nil |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
/* |
||||||
|
* Mini Object Storage, (C) 2014 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package strbyteconv |
||||||
|
|
||||||
|
import ( |
||||||
|
. "gopkg.in/check.v1" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
type MySuite struct{} |
||||||
|
|
||||||
|
var _ = Suite(&MySuite{}) |
||||||
|
|
||||||
|
func Test(t *testing.T) { TestingT(t) } |
||||||
|
|
||||||
|
func (s *MySuite) Test(c *C) { |
||||||
|
value := BytesToString(100 * UNIT_BYTE) |
||||||
|
c.Assert(value, Equals, "100B") |
||||||
|
|
||||||
|
value = BytesToString(100 * UNIT_KILOBYTE) |
||||||
|
c.Assert(value, Equals, "100KB") |
||||||
|
|
||||||
|
value = BytesToString(100 * UNIT_MEGABYTE) |
||||||
|
c.Assert(value, Equals, "100MB") |
||||||
|
|
||||||
|
value = BytesToString(100 * UNIT_GIGABYTE) |
||||||
|
c.Assert(value, Equals, "100GB") |
||||||
|
|
||||||
|
value = BytesToString(100 * UNIT_TERABYTE) |
||||||
|
c.Assert(value, Equals, "100TB") |
||||||
|
|
||||||
|
bytes, err := StringToBytes("100KB") |
||||||
|
c.Assert(err, IsNil) |
||||||
|
c.Assert(bytes, Equals, uint64(100*UNIT_KILOBYTE)) |
||||||
|
|
||||||
|
bytes, err = StringToBytes("100MB") |
||||||
|
c.Assert(err, IsNil) |
||||||
|
c.Assert(bytes, Equals, uint64(100*UNIT_MEGABYTE)) |
||||||
|
|
||||||
|
bytes, err = StringToBytes("100GB") |
||||||
|
c.Assert(err, IsNil) |
||||||
|
c.Assert(bytes, Equals, uint64(100*UNIT_GIGABYTE)) |
||||||
|
|
||||||
|
bytes, err = StringToBytes("100TB") |
||||||
|
c.Assert(err, IsNil) |
||||||
|
c.Assert(bytes, Equals, uint64(100*UNIT_TERABYTE)) |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue