Add helper method for turning int|float into base-10 unsigned integer string.

This commit is contained in:
Andreas Fischer 2014-02-15 23:21:23 +01:00
parent 82e17155bf
commit 2c36a4b07a
2 changed files with 70 additions and 0 deletions

View File

@ -12,6 +12,30 @@ namespace OC;
* Helper class for large files on 32-bit platforms.
*/
class LargeFileHelper {
/**
* @brief Formats a signed integer or float as an unsigned integer base-10
* string. Passed strings will be checked for being base-10.
*
* @param int|float|string $number Number containing unsigned integer data
*
* @return string Unsigned integer base-10 string
*/
public function formatUnsignedInteger($number) {
if (is_float($number)) {
// Undo the effect of the php.ini setting 'precision'.
return number_format($number, 0, '', '');
} else if (is_string($number) && ctype_digit($number)) {
return $number;
} else if (is_int($number)) {
// Interpret signed integer as unsigned integer.
return sprintf('%u', $number);
} else {
throw new \UnexpectedValueException(
'Expected int, float or base-10 string'
);
}
}
/**
* @brief Tries to get the filesize of a file via various workarounds that
* even work for large files on 32-bit platforms.

View File

@ -0,0 +1,46 @@
<?php
/**
* Copyright (c) 2014 Andreas Fischer <bantu@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace Test;
class LargeFileHelper extends \PHPUnit_Framework_TestCase {
protected $helper;
public function setUp() {
parent::setUp();
$this->helper = new \OC\LargeFileHelper;
}
public function testFormatUnsignedIntegerFloat() {
$this->assertSame(
'9007199254740992',
$this->helper->formatUnsignedInteger((float) 9007199254740992)
);
}
public function testFormatUnsignedIntegerInt() {
$this->assertSame(
PHP_INT_SIZE === 4 ? '4294967295' : '18446744073709551615',
$this->helper->formatUnsignedInteger(-1)
);
}
public function testFormatUnsignedIntegerString() {
$this->assertSame(
'9007199254740993',
$this->helper->formatUnsignedInteger('9007199254740993')
);
}
/**
* @expectedException \UnexpectedValueException
*/
public function testFormatUnsignedIntegerStringException() {
$this->helper->formatUnsignedInteger('900ABCD254740993');
}
}